Strange results in deletion of lines

Geoff Canyon Rev gcanyon+rev at gmail.com
Tue May 11 01:31:45 EDT 2010


Just in case anyone doesn't realize how different the options are, I
wrote this code.

on mouseUp
   repeat 30000
      put any char of "abcdefghijklmnopqrstuvwxyz" && random(100000)
&& "this is a test string for a fixed-record-length processing test" &
cr after X
   end repeat
   delete char -1 of X
   put ticks() into t1
   repeat 1
      put X into X1
      repeat with i = the number of lines of X1 down to 1
         if char 1 of line i of X1 is "f" then delete line i of X1
      end repeat
   end repeat
   put ticks() - t1 into t1
   put ticks() into t2
   repeat 100
      put X into X2
      filter X2 without "f*"
   end repeat
   put ticks() - t2 into t2
   put ticks() into t3
   repeat 100 times
      put empty into X3
      repeat for each line L in X
         if char 1 of L is "f" then next repeat
         put L & cr after X3
      end repeat
      delete char -1 of X3
   end repeat
   put ticks() - t3 into t3
   put X1 into fld 1
   put X2 into fld 2
   put X3 into fld 3
   put t1 && t2 && t3 && (X1 is X2) && (X2 is X3)
end mouseUp


Note that the filter and repeat for each options each run 100 times,
while the repeat with i = the number of lines of X1 down to 1 example
runs just once. Here are the results:

3096 99 118 true true

So the filter and repeat for each options run in about a sixtieth of a
second (remember, they each ran 100 times), while the repeat with i
=... option takes almost a minute.

The crucial lesson here is avoid expressions like line i of..., but
only slightly less important is the fact that repeat for each works
about as fast as filter. If you have a complex operation to perform on
each line, running multiple filter operations to get it done is likely
not as efficient as a simple repeat for each loop. As a simple
example, repeat for each is faster here:

on mouseUp
   repeat 30000
      put any char of "abcdefghijklmnopqrstuvwxyz" && random(100000) && \
             "this is a test string for a fixed-record-length
processing test" && \
             any char of "abcdefghijklmnopqrstuvwxyz" & cr after X
   end repeat
   delete char -1 of X
   put ticks() into t2
   repeat 100
      put X into X2
      filter X2 without "f*"
      filter X2 without "*g"
   end repeat
   put ticks() - t2 into t2
   put ticks() into t3
   repeat 100 times
      put empty into X3
      repeat for each line L in X
         if char 1 of L is "f" or char -1 of L is "g" then next repeat
         put L & cr after X3
      end repeat
      delete char -1 of X3
   end repeat
   put ticks() - t3 into t3
   put X1 into fld 1
   put X2 into fld 2
   put X3 into fld 3
   put t2 && t3 && (X2 is X3)
end mouseUp



More information about the Use-livecode mailing list