Thursday, November 12, 2009

performance of various javascript calling methods and proxies



median times in miliseconds for 20000 reps of a simple counting algorithm, testing various forms of dispatch, eg closures, classes, goog.inherit, dojo.hitch (method.apply), dojo.delegate, dojo.extend, a few of my methods similar to hitch, inline, custom function as a proxy, and proxies using method.call instead of method.apply


caveat emptor: benchmarking is hard, and i'm new enough to javascript that i'm not 100% confident in the numbers. my tests are very simple, but i have tried to make them difficult to optimize out. the basic algorithm is the following, which is far from foolproof.



function(ko) {
    ko = ++ko % this.po;
    ko == 0 && (this.po++);
    return ko;
}








median
std dev

Chrome
Firefox 3.5
IE 7
Chrome
Firefox 3.5
IE 7
class
2
14
62
0.41
0.85
0.5
goog.inherit
2
16
78
0.73
0.9
0.35
closure
2
16
63
0.5
0.62
0.5
dojo.delegate
3
15
63
0.52
0.7
4.03
dojo.extend
3
14
63
0.62
0.64
0.45
dojo.hitch
13
141
297
1.25
190.2
7.93
nqo.proxy
4
136
281
0.41
139.61
0.5
hitchArgs
256
381
1312
3.33
189.79
7.18
proxyArgs
202
273
813
5.58
190.16
6.43
functionProxy
3
24
125
0.26
0.88
0
functionArgs
3
24
125
0.41
0.9
4.12
callProxy
6
35
156
0.45
1.08
0
callProxy1
3
29
141
0.35
1.42
5.44
callArgs
25
40
172
0.72
1.55
0.41
inline
1
5
15*
0.41
0.26
5.43



Conclusions: Chrome > Firefox > IE 7, function.call > function.apply, any of the class or closure based approaches worked about the same, regardless of the inheritance mechanism. the dojo.extend style seems slightly faster to invoke, but for any real problem i don't think it's worth worrying about. dojo.hitch and function.apply seem massively slow, especially when combining arguments from the hitch and the invocation. function.call is much faster, and a custom function as a proxy is faster yet - taking about twice as long as directly accessing the source object

* my tool reported mostly 0 msec on IE 7, but every by-hand test that i did was 15 or 16 msec. pretty sure that the delta in Date() isn't working in tight loops

1 comment:

tamasyarboro said...

The first is the purpose unfold, which is a wager on the margin of victory. Any cricketer or player help staffer who's presently beneath 메리트카지노 a ban imposed for violations of the ICC anti-corruption code, or the equivalent code of any nationwide federation. The betting ban, as within the case of The FA's guidelines outlined above, additionally extends to providing inside info that the tipper may reasonably consider will be used to wager on a WBSC event. However, someone concerned solely with a nationwide softball team can wager on an MLB game.