On 2021-08-25 18:15, Ben Rubinstein via use-livecode wrote:
I simplified it down to this (pointless) loop which just rebuilds a
table one line at a time:

   local tNewTable
   repeat for each line tRow in tWorkTable
      put tRow & return after tNewTable
   end repeat

with these results:

        6.7.11 MacOS      8 seconds
        6.7.11 Win32      7 seconds
        9.6.3  MacOS      0 seconds
        9.6.3  Win32    591 seconds

Using a buffer var should workaround the performance issue (which is related to the windows heap manager not being very good at continually re-extending a buffer):

on mouseUp
   local tLine
   repeat 256 times
      put "*" after tLine
   end repeat

   local tTime
   put the millisecs into tTime

   local tBuffer

   local tText
   repeat 257000 times
      put tLine & return after tBuffer
      if the number of codeunits in tBuffer > 500000 then
         put tBuffer after tText
         delete codeunit 1 to -1 of tBuffer
      end if
   end repeat
   put tBuffer after tText
answer (the number of codeunits in tText) & return & (the millisecs - tTime)
end mouseUp

In the original loop, tNewTable is continually extended internally, something which appears to cause O(n^2) performance on Windows.

In the revised loop, an intermediate buffer var is used which (after first time getting 'full') will have a backing store of 500k ish - meaning tText is extended much less often. (Playing with the value of 500000 up or down will affect the resulting speed - there will always be a sweet spot).

On my Windows VM - the above loop (which generates about 68mb of text or so, takes about 3s.

Hope this helps!

Mark.

P.S. This is an engine issue - we'll need to look into why there's such a difference with 6.7 - as, I'm pretty sure I kept the rules about extending buffers pretty much the same in string concatenation.

--
Mark Waddingham ~ m...@livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to