Fwd: Speed of control lookup (Was Re: Parent of Target)

Mark Waddingham mark at livecode.com
Fri Aug 11 08:57:43 EDT 2017


On 2017-08-11 11:12, Mark Waddingham via use-livecode wrote:
> On 2017-08-10 21:10, Richard Gaskin via use-livecode wrote:
>> How might I measure the benefits of long ID caching?

Here is perhaps a better set of simple benchmarks to compare approaches 
to lookup (related to ids, anyway):

========

on mouseUp
    local tIterations
    put 100000 into tIterations

    -- card id is 1002
    -- button id is 1003
    -- group id is 1004
    local tLongId
    put the long id of button id 1003 of group id 1004 of card id 1002 
into tLongId

    local tButtonIdOfStack
    put "button id 1003 of stack" && quote & "LongIdSpeedTest" & quote 
into tButtonIdOfStack

    local tButtonIdOfCardIdOfStack
    put "button id 1003 of card id 1002 of stack" && quote & 
"LongIdSpeedTest" & quote into tButtonIdOfCardIdOfStack

    local tTime
    put the millisecs into tTime
    repeat tIterations times
       get the id of me
    end repeat
    put "Control" && (the millisecs - tTime) & return into msg

    put the millisecs into tTime
    repeat tIterations times
       get the id of tLongId
    end repeat
    put "GetIdOfLongIdInString" && (the millisecs - tTime) & return after 
msg

    put the millisecs into tTime
    repeat tIterations times
       get the id of tButtonIdOfCardIdOfStack
    end repeat
    put "GetIdOfButtonIdOfCardIdOfStackInString" && (the millisecs - 
tTime) & return after msg

    put the millisecs into tTime
    repeat tIterations times
       get the id of tButtonIdOfStack
    end repeat
    put "GetIdOfButtonIdOfStackInString" && (the millisecs - tTime) & 
return after msg

    put the millisecs into tTime
    repeat tIterations times
       get the id of button id 1003 of group id 1004 of card id 1002 of 
stack "LongIdSpeedTest"
    end repeat
    put "GetIdOfButtonIdOfGroupIdOfCardIdOfStack" && (the millisecs - 
tTime) & return after msg

    put the millisecs into tTime
    repeat tIterations times
       get the id of button id 1003 of card id 1002 of stack 
"LongIdSpeedTest"
    end repeat
    put "GetIdOfButtonIdOfCardIdOfStack" && (the millisecs - tTime) & 
return after msg

    local tStackString
    put "LongIdSpeed" & "Test" into tStackString

    put the millisecs into tTime
    repeat tIterations times
       get the id of button id 1003 of group id 1004 of card id 1002 of 
stack tStackString
    end repeat
    put "GetIdOfButtonIdOfGroupIdOfStackNotName" && (the millisecs - 
tTime) & return after msg

    put the millisecs into tTime
    repeat tIterations times
       get the id of button id 1003 of card id 1002 of stack tStackString
    end repeat
    put "GetIdOfButtonIdOfCardIdOfStackNotName" && (the millisecs - 
tTime) & return after msg
end mouseUp

========

On my machine (in 8.1.5) I get:

Control 21
GetIdOfLongIdInString 714
GetIdOfButtonIdOfCardIdOfStackInString 497
GetIdOfButtonIdOfStackInString 320
GetIdOfButtonIdOfGroupIdOfCardIdOfStack 56
GetIdOfButtonIdOfCardIdOfStack 53
GetIdOfButtonIdOfGroupIdOfStackNotName 65
GetIdOfButtonIdOfCardIdOfStackNotName 63

So, currently, there is a significant overhead to getting a control 
reference out of a string - the minimum you actually need in a string to 
uniquely identify a control (which may or may not have per-card data) is 
"control id ... of card id ... of stack ...".

Indeed - using the minimal info you need hard-coded in syntax:

       get the id of button id 1003 of card id 1002 of stack tStackString

Is about 10 times faster than using a long id in a string and about 8 
times faster than using a modified form of a string id to cut out the 
(strictly) unnecessary bits:

       get the id of "button id 1003 of card id 1002 of stack 
LongIdSpeedTest" -- quoted name, appropriately

So, my advice changes *slightly* - if you are doing tight loops which 
need to manipulate lots of controls in the current card of the 
defaultStack use:

       control id <id>

If the things aren't on the current card of the default stack, then 
extract the card id and stack name outside of the loop and use:

       control id <id> of card id tCardId of stack tStackName

The question of course is 'how fast could we get long id parsing to be' 
(as that is the bottleneck here, or at least appears to be).

Warmest Regards,

Mark.

P.S. Due to a mailing server glitch any mails which were sent here 
between 12:30BST and 14:00BST will not have got through.

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




More information about the Use-livecode mailing list