LCB Performance

Mark Waddingham mark at livecode.com
Wed Aug 8 07:28:56 EDT 2018


You might be better off building the primes as a List, then converting to a string at the end. Although the conversion of each number is only done once so it probably doesn't make too much difference (apart from being a bit more LCBy).

In general LCB should be written to prefer structure over strings - it better represents the flow of individual values - which makes any future optimisations at the vm level more effective.

LCB should really be considered the language to use for widgets and foreign extensions - for much algorithmic stuff you'll get better performance from LCS.

To be fast LCB needs an optimisation phase which would lower the level of operations it performs - the internal structure of LCB makes this feasible but as yet not done.

In contrast LCS is pretty quick - it also needs an optimisation phase really - but with its current implementation that's largely infeasible!

(The optimisation phase would actually be the same - the problem is that both need to be translated to a slightly lower level common bytecode form first - then optimised).

Warmest Regards,

Mark.

Sent from my iPhone

> On 7 Aug 2018, at 22:54, Brian Milby via use-livecode <use-livecode at lists.runrev.com> wrote:
> 
> 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
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode





More information about the use-livecode mailing list