JScript高速化(2)

もっとまじめに考えよう。
プロパティへの代入ってどうなんだろう。
こんなコードを考えてみよう。


var n = 100000;

// 509ms
var a = [ ];
for(var i = 0; i < n; i++) {
for(var j = 0; j < 10; j++)
a[j] = j;
}


// 203ms
var a = [ ];
for(var i = 0; i < n; i++) {
for(var j = 0; j < 10; j++)
;
}

つまり、プロパティ(配列の要素)への代入は、0.3μs。
ということは、新たにプロパティを作るのに、1.3μs。
オブジェクトを新たに作るというのは、
プロパティを作るのに時間がかかっているっていうことか。


じゃあ、まとめてプロパティを生成するってのはどうだ。


// 1981ms
var a = [ ];
for(var i = 0; i < n; i++) {
var a = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
for(var j = 0; j < 10; j++)
a[j] = j;
}

だめだ、ほとんど速くない。
じゃあ、ほとんどコピーのメソッドを使うっていうのは?


// 2873ms
var a10 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
for(var i = 0; i < n; i++) {
var a = a10.slice(0);
for(var j = 0; j < 10; j++)
a[j] = j;
}

驚くほど遅い。
何か手はないのか。


// 3013ms
var s = "0,0,0,0,0,0,0,0,0,0";
for(var i = 0; i < n; i++) {
var a = s.split(',');
for(var j = 0; j < 10; j++)
a[j] = j;
}

これも遅い。


// 3902ms
var s = "[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]";
for(var i = 0; i < n; i++) {
var a = eval(s);
for(var j = 0; j < 10; j++)
a[j] = j;
}

まあ、遅いわな。
どうもどうやっても遅いらしい。
とにかくオブジェクトを構築するのには時間がかかるらしい。