I hadn't considered the ramifications of a "miss" on a sparse array, and since (in my test case) only 18% of the string being traversed was white space, then there were a lot of "misses".
Thanks for the great response - it helped a lot. Chad On Jul 8, 1:57 am, "Lasse R.H. Nielsen" <[email protected]> wrote: > I am guessing[1] it's just a matter of being very fast at calling functions > vs. needing to do extra work for missing elements in the array. > > I'm assuming your array is sparse (only have elements at the positions that > are actually whitespace). > That means that for all non-whitespace char-codes, you first fail to find > the property in the whitespace array, and then you traverse the prototype > chain and fail to find it in Array.prototype and Object.prototype as well. > It's also likely that the sparse array is implemented using a hash-map, > meaning that it has to do even more computation before it can fail to find > the value. > > The function call, on the other hand, always call the same function, so the > Inline Cache will speed up the actual call a lot. > > There is a prevalent superstition that function calls have to be slow. > That's just not true. Compared to many other things a JavaScript engine has > to do, function calls can be pretty quick. > > /Lasse > [1] from the code shown, it's impossible to be certain what bottlenecks are > most significant.On Wed, Jul 7, 2010 at 15:01, Chad <[email protected]> > wrote: > > Sorry - should have specified the version that yielded these numbers > > is: Chrome (Mac) v 5.0.375.99. > > > On Jul 7, 7:54 am, Chad <[email protected]> wrote: > > > I was surprised to find that a function call returning a boolean from > > > a simple test was much (3x!) faster than an associative array > > > lookup... I was wondering if someone could explain to me how that > > > could be the case. Is v8 inlining the function somehow, or is the > > > overhead of a function call extremely low? > > > > Note 1: I'm not complaining, I'm just curious as to how things were > > > working under the covers. > > > Note 2: The opposite is true for Firefox, which is 2x slower using the > > > function call than the associative array... so an optimization for one > > > would result in a performance regression for another... :( > > > > Example: > > > > ------ > > > isWhitespace:function(charCode) { > > > return charCode == this.spaceCharCode || charCode == > > > this.tabCharCode || ... etc ...; > > > > }, > > > > for (var i = 0; i < aString.length; i++) { > > > var isWs = this.isWhitespace(aString.charCodeAt(i));} > > > > ------ > > > > Is 3x faster than: > > > > ------ > > > whitespace: Associative array mapping whitespace char codes to true, > > > > for (var i = 0; i < aString.length; i++) { > > > var isWs = this.whitespace[aString.charCodeAt(i)];} > > > > ------ > > > > Thanks in advance, Chad > > > -- > > v8-users mailing list > > [email protected] > >http://groups.google.com/group/v8-users > > > -- > > Lasse R.H. Nielsen / <http://groups.google.com/group/v8-users> > > [email protected] > > 'Faith without judgement merely degrades the spirit divine' -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
