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;' でようやく同じくらいの速さになる。