Ben Rubinstein wrote:

> So the typical routine is something like
>
>    do makeAccessVars("vi", line 1 of tTSVdata)

There's your first bug right there - that should be:

        do makeAccessVars("emacs", line 1 of tTSVdata)

(Ducking from Mark Wieder who will no doubt groan at the pun <g>)

But more seriously, the meat here is this:

>   doSomething item viUserID of tRec, item viUserName of tRec

...vs:

>   doSomething aData["User ID"], aData["User Name"]

On the one hand, each array access requires a small amount of overhead to run the key through a hash to find the value's address. However, that overhead is pretty small as hashes go, since it's not using anything heavy-duty like a cryptographic hash (no sha1Digest or even md5Digest), but some very small bit-shifting hash that only works as hard as it needs to to distribute addresses somewhat uniformly across internal buckets of addresses.

On the other hand, any chunk expression like "item viUserID of tRec" will require tRec to be traversed from its beginning, evaluating each character along the way, counting item delimiters as it goes.

Of course the loop you have there is much better than "repeat with", since at least each line itself is efficiently isolated for the item-test traversal. But within each line traversal is still needed to identify items.

The cases I've seen where chunk expressions can outperform arrays tend to be those with a large number of lines and a small number of items, in which each item is itself a fairly short string. And even then, other specifics about the data can come into play affecting measurable outcomes.

But given how lean the hash used for arrays is, I've found only a relatively small number of such cases.

The bigger difference by far will be with loading whichever structure you use. While it does indeed require more or less the same character-by-character evaluation to split a chunk into an array, when the alternative leaves you with "do" you're up against the performance weaknesses inherent in it, which require dynamic evaluation of the expression and its context.

It takes a fair bit of exploration to find anything slower than "do" (though I'm sure there are a few cases if we look hard enough).

"do" is great for those rare moments when we truly have no alternative.

And since HyperCard didn't offer arrays, that was usually every day. :)

But arrays are a natural fit for cases where not only elements within a collection are variables, but also the names of those elements as well.

Indeed, that's the use case they were introduced to support.

--
 Richard Gaskin
 Fourth World Systems
 Software Design and Development for the Desktop, Mobile, and the Web
 ____________________________________________________________________
 ambassa...@fourthworld.com                http://www.FourthWorld.com

_______________________________________________
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