V8 で -- array.length; より array.pop(); の方がかなり速い
function strTimes(str, times) { var result = ''; for(var i = 0; i < times; ++ i) { result += str; } return result; } function benchmark(s, n) { var array = []; for(var i = 0; i < n; ++ i) { array[i] = null; } var body = ''; if((n / 50 | 0) > 0) { body += 'for(var i = 0; i < '+(n / 50 | 0)+'; ++ i) {'; body += strTimes(s, 50); body += '}'; } body += strTimes(s, n % 50); var fn = new Function('array', body); var st = +new Date; fn(array); var ed = +new Date; print(s + ': '+(ed - st)+' ms'); } var n = 1000000; benchmark('array.pop();', n); benchmark('-- array.length;', n);
V8 version 0.4.4.1 array.pop();: 25 ms -- array.length;: 937 ms
差がありすぎる。pop() は関数呼び出しのオーバーヘッドがあって重いかと思っていたのにまったく正反対の結果。どういうことなの…
'array.pop();array.pop();array.pop();' と 'array.length -= 3;' でもまだまだ pop() の圧勝で、strTimes('array.pop();', 40) と 'array.length -= 40;' でようやく同じくらいの速さになる。