Delete char in string

Kay C Lan lan.kc.macmail at gmail.com
Wed Feb 19 21:06:57 EST 2014


I hate it when I post too quickly.

0 ms was just too good to be true so I investigated further and found 2
errors in my code. The real figures are

10,000 Unicode
Repeat Until: 19 ms
Repeat for Each: 3 ms

100,000 Unicode
Repeat Until: 1823 ms
Repeat for Each: 30 ms

1,000,000 Unicode
Repeat Until: 236688 ms
Repeat for Each: 295 ms

Which still proves the point that 'repeat for each' scales much better than
other repeat forms.

Corrected script below:
on mouseUp
   --breakpoint
   --create a random list of 20 ASCII chars between ASCII32 - ASCII 125
   set the useUnicode to false
   put empty into tLIST
   repeat 20 times
      put numToChar(random(94) + 31) after tLIST
   end repeat
   ask "How many characters do you want to process" with 100000 titled
"Enter Digits Only - No Punctuation"
   put it into tNumOfChars
   answer "Do you wish to test against Unicode chars?" with "Yes" or "No"
titled "Test Unicode"
   put it into tUniCode
   if (tUniCode = "Yes") then
      set the useUnicode to true
      put 65535 into tUpperLimit
   else
      put 255 into tUpperLimit
   end if
   repeat tNumOfChars times
      put numToChar(random(tUpperLimit)) after tORIGIN
   end repeat
   put the number of chars in tORIGIN into msg
   --so the 2nd test is identical
   put tORIGIN into tORIGIN2
   --TEST 1 TIMING
   put the millisec into tStartTime
   repeat until tORIGIN is empty
      if tLIST contains the first char of tORIGIN then
         put the first char of tORIGIN after tOUTPUT
         delete the first char of tORIGIN
      else
         delete the first char of tORIGIN
      end if
      --put $ORIGIN into fld "fORIGIN2"--not required
   end repeat
   put tOUTPUT into tTest1
   put the millisec into tEndTime
   put tEndTime - tStartTime into tTest1Time

   --TEST 2 TIMING
   put the millisec into tStartTime
   repeat for each char tChar in tORIGIN2
      if (tLIST contains tChar) then
         put tChar after tOUTPUT2
      end if
   end repeat
   put tOUTPUT2 into tTest2
   --breakpoint
   put the millisec into tEndTime
   put tEndTime - tStartTime into tTest2Time
   --breakpoint
   if (tTest1 = tTest2) then
      put "Repeat Until: " & tTest1Time & " ms" & cr &  \
            "Repeat for Each: " & tTest2Time & " ms" into msg
   else
      put "Failed - Outputs not equal" into msg
   end if
   beep
   --breakpoint
end mouseUp



More information about the use-livecode mailing list