26 October 2011

When I look at code like the memoizer, I find things that others gloss over because of my training. My most recent project involves a huge application with brutal SLA’s. We must look at every function call or loop critically in order to achieve the required speed. That often means A/B testing in multiple browsers to see where we can shave a few milliseconds.

Here’s another example of what I’m talking about. How often do you see developers manipulate arguments in a function the way the memoizer did?

var args = Array.prototype.slice.call(arguments);

It’s pretty standard. Well, it may seem trivial, but nothing’s free. If you don’t have to do it, don’t–that’s the easiest way to boost performance. I wrote two example tests for the most common uses of arguments: iterating and prepending.

(function () {
var i, len;
//just iterate, you don't need an Array method (forEach is slow!)
for (i = 0, len = arguments.length; i < len; i += 1) {
noop(arguments[i], i);
}(3, 2, 1));

var list = [3];
(function () {
var i, len, llen;
//we know getting length once is fast, so do it here then add them
for (i = 0, llen = list.length, len = llen + arguments.length; i < len; i += 1) {
//determine which set to use based on i and the length of the prepended set
//just use property access to get arguments out, no slice, no concat
console.log(llen > i ? list[i] : arguments[i - llen], i);
}(2, 1));

get the Gist


blog comments powered by Disqus