This is why LCMark gets the big bucks.

Craig

> On Dec 15, 2023, at 10:00 AM, Mark Waddingham via use-livecode 
> <use-livecode@lists.runrev.com> wrote:
> 
> On 2023-12-14 21:22, Paul Dupuis via use-livecode wrote:
>> Which is faster or more efficient (from an engine performance perspective)?
>> To retrieve an array from a property?
>> As in:
>> command someHandler -- in an objects script
>>   get the cMyArray from me -- cMyArray is some multi-dimensional array
>>   ...
>> end someHandler
>> OR
>> To retrieve an array from a script local variable?
>> As in:
>> local sMyArray -- script local variable in some objects script
>> command someHandler -- in an objects script
>>   get sMyArray
>>   ...
>> end someHandler
>> Anyone know?
> 
> Fetching a value directly from a variable will always be faster than any 
> other method - as it essentially reduces to fetching or storing a value from 
> a (integer indexed) table.
> 
> In contrast, fetching a custom property will require a message send unless 
> lock messages is set, and then an array lookup (to actually get the 
> property's value).
> 
> Custom property sets are stored using the same data structure internally as 
> livecode arrays so getting `the cMyArray of me` eventually reduces to the 
> same as objectsCurrentPropertySet["cMyArray"] - the latter lookup is more 
> work than just fetching a value from an internal table.
> 
> UPSHOT:
> 
> Fetching a value directly from a variable is a constant time operation.
> 
> If lock messages is false, then the time it takes to fetch a custom property 
> value will be somewhat proportional to the length of the message path from 
> the point of view of the object you are accessing - i.e. how many 
> frontscripts, backscripts, stacks in use, and parent objects/behaviors the 
> object has.
> 
> If lock messages is true, then the time it takes to fetch a custom property 
> value will be pretty much the same as doing an LC array key lookup.
> 
> Now whether or not this actually matters in any one case will largely depend 
> on how often such access is being done - if its a few times in the context of 
> UI-related code then it probably won't be appreciable; if, however, you are 
> fetching a custom property 100000's of times in a tight loop and the rest of 
> the loop is only doing small amounts of work, you'll definitely notice a 
> difference.
> 
> SIMPLE BENCHMARK:
> 
> ```
> 
> on mouseUp
> local sMyArray
> 
> on mouseUp
>   set the cMyArray of me to [ 1, 2, 3 ]
>   put empty
> 
>   local tTime
>   put the milliseconds into tTime
>   repeat 1000000 times
>      get the cMyArray of me
>   end repeat
>   put "CUSTOM PROP:" && the milliseconds - tTime & return after msg
> 
>   put the milliseconds into tTime
>   lock messages
>   repeat 1000000 times
>      get the cMyArray of me
>   end repeat
>   unlock messages
>   put "CUSTOM PROP (LOCKED OUTSIDE):" && the milliseconds - tTime & return 
> after msg
> 
>   put the milliseconds into tTime
>   repeat 1000000 times
>      lock messages
>      get the cMyArray of me
>      unlock messages
>   end repeat
>   put "CUSTOM PROP (LOCKED INSIDE):" && the milliseconds - tTime & return 
> after msg
> 
>   local tMyProps
>   put [ 1, 2, 3 ] into tMyProps["cMyArray"]
>   put the milliseconds into tTime
>   repeat 1000000 times
>      get sMyArray["cMyArray"]
>   end repeat
>   put "ARRAY ELEMENT:" && the milliseconds - tTime & return after msg
> 
>   put the milliseconds into tTime
>   lock messages
>   repeat 1000000 times
>      get sMyArray
>   end repeat
>   unlock messages
>   put "SCRIPT LOCAL:" && the milliseconds - tTime & return after msg
> end mouseUp
> end mouseUp
> ```
> 
> RESULTS (1 million iterations):
> 
> CUSTOM PROP: 2006
> CUSTOM PROP (LOCKED OUTSIDE): 116
> CUSTOM PROP (LOCKED INSIDE): 125
> ARRAY ELEMENT: 80
> SCRIPT LOCAL: 38
> 
> ANALYSIS:
> 
> The above results are run in the IDE which is important to mention because 
> the message path in the IDE is typically longer than that in standalones (as 
> the all extension libraries are loaded, and the IDE inserts its own 
> front/back/stacks into the message path).
> 
> Accessing custom properties with messages locked is nearly 10x faster than 
> without (again that multiplier will be vary with the length of the message 
> path).
> 
> Using lock/unlock messages for every custom property access has a (quite 
> negligible) 10% overhead - and the message path overhead (in the IDE) is 
> about 40% of the total (the array element fetch will be the rest).
> 
> Accessing a script local is
>  - about 50x faster than accessing a custom property when messages are sent
>  - about 3x faster than accessing a custom property when messages are not sent
>  - about 2x faster than accessing an array element
> 
> Just to reiterate - these figures are for 1,000,000 accesses done in a tight 
> loop (in the IDE). If you do it for (say) 1000 iterations then the 
> differences are within the margin of error of measuring a millisecond.
> 
> Overall, my suggestion would be probably to do a combination of both - if you 
> are only reading from a custom property in a given loop, but are doing so 
> multiple times for the same property (and the loop actually has a very high 
> number of iterations!) then fetch into a local variable before the loop and 
> then use that value (the same, to be fair, is true of calling functions which 
> return fixed values and accessing array elements - especially ones on paths 
> longer than one).
> 
> Hope this helps,
> 
> Mark.
> 
> -- 
> Mark Waddingham ~ m...@livecode.com ~ http://www.livecode.com/
> LiveCode: Build Amazing Things
> 
> _______________________________________________
> 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


_______________________________________________
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