LCB Performance
Brian Milby
brian at milby7.com
Tue Aug 7 23:54:16 EDT 2018
This is a continuation of some code introduced in the "valueDiff" thread,
but wanted to take it in a slightly different direction. We had some great
success at getting a process that took over 50 seconds on my machine down
to under 10 seconds. It isn't anything that we would actually use in
production, but I'm sure things like this can help us in the real world.
I decided to try and port the fastest of the methods over to LCB. I'm sure
quite a bit of it is due to my lack of experience, but the speeds were much
slower. I ended up putting some hard coded limits in my stack so that LCB
wasn't used over 100,000 for the List and Array version and 1,000,000 for
the Byte version.
What I found was that for arrays, the requirement to convert the number to
a string killed the performance (my guess anyway). Here is a full list of
the various versions that I've tried:
"Find primes up to 100000, repeat 1 time(s)"
"Byte (bernd)" - 0.065108 seconds
"Byte (bwm)" - 0.103379 seconds
"Byte (alex)" - 0.122581 seconds
"Array (mark)" - 0.323269 seconds
"Array (bwm)" - 0.345896 seconds
"Array (original)" - 0.386326 seconds
"Byte (LCB)" - 1.125969 seconds
"List (LCB)" - 136.770451 seconds
"Array (LCB)" - 845.35211 seconds
I've updated the stack that I uploaded with the new tests (but one would
need to compile/install the LCB for the last 3 tests)
https://milby.us/lc/Primes.livecode
Here's one of the handlers that I converted:
public handler getPrimesLCB_List(in pN as Number) returns String
variable tMroot as Number
variable tPrimes as String
variable tIsItPrime as List
variable tTenK as List
variable tYes as Data
variable tNo as Data
variable tI as Number
variable tJ as Number
put the byte with code 66 into tYes
put the byte with code 65 into tNo
if pN < 2 then
return the empty string
else if pN = 2 then
return "2"
end if
put (the trunc of sqrt(pN)) - 1 into tMroot
put the empty list into tIsItPrime
if pN >= 10000 then
put the empty list into tTenK
repeat 10000 times
push tYes onto tTenK
end repeat
repeat (pN / 10000) times
put tTenK & tIsItPrime into tIsItPrime
end repeat
end if
repeat pN mod 10000 times
push tYes onto tIsItPrime
end repeat
put "2" into tPrimes
repeat with tI from 3 up to tMroot by 2
if tIsItPrime[tI] is tNo then
next repeat
end if
put "\n" & tI formatted as string after tPrimes
repeat with tJ from tI^2 up to pN by tI
put tNo into tIsItPrime[tJ]
end repeat
end repeat
repeat with tI from tMroot + (tMroot + 1) mod 2 up to pN - 1 by 2
if tIsItPrime[tI] is tYes then
put "\n" & tI formatted as string after tPrimes
end if
end repeat
return tPrimes
end handler
Is there any way to optimize the speed of LCB to meet/exceed the same code
in LCS or is the intention more for things where the speed isn't the main
factor (like UI widgets and interacting with external code via FFI)?
Thanks,
Brian
More information about the use-livecode
mailing list