List Access
When you access an attribute of a list, it is much faster to target a reference to the list, or the list as a script property, than to target the list directly. It's not entirely clear why this is; it seems like a bug. But it's a venerable and acknowledged bug, because even Apple's earliest documentation on AppleScript contains an example illustrating this point.
In this code (based on Apple's example) we total the numbers in a long list:
set L to {} set total to 0 set bignum to 5000 repeat with i from 1 to bignum set end of L to i end repeat repeat with i from 1 to bignum set total to total + (item i of L) end repeat total -- 12502500, and it takes about 22 seconds to run on my machine
The big slowdown here is the second repeat block, accessing items of the list. If we access these items by way of a reference to the list, things speed up dramatically:
set L to {} set refL to a reference to L set total to 0 set bignum to 5000 repeat with i from 1 to bignum set end of L to i end repeat repeat with i from 1 to bignum set total to total + (item i of refL) end repeat total -- 12502500, and it took less than a second
Instead of a reference, you can get the same extraordinary speed bump by referring to the list as a script property:
set L to {} set total to 0 set bignum to 5000 repeat with i from 1 to bignum set end of L to i end repeat repeat with i from 1 to bignum set total to total + (item i of my L) end repeat total -- 12502500, and it took less than a second
The magic word ...
Get AppleScript: The Definitive Guide, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.