JScript高速化(4)

new

前回、コンストラクタのコストが高いことが分かったので、
これをどうにかしよう。


まず、最小のユーザ定義オブジェクトの生成を見てみよう。


function poly() {
;
}

この生成を10万回実行する。


// 642ms
for(var i = 0; i < n; i++)
new poly();


// 33ms
for(var i = 0; i < n; i++)
;

つまり、何の中身もなくても、
1個のオブジェクト生成に6.1μsもかかるわけだ。


では、1つプロパティがあれば、


// 927ms
function poly() {
this.a = 0;
}

プロパティの生成に3μs。
やっぱりArrayオブジェクトの倍くらいかかっている。
これがArrayオブジェクトになると、


// 1467ms
function poly() {
this.a = [ 0 ];
}

1つからメソッドをつける。


// 2120ms
function poly() {
this.a = [ 0 ];

this.copy = function() {
;
}
}

メソッドを外に出したら?


// 1597ms
function poly() {
this.a = [ 0 ];

this.copy = poly_copy;
}

function poly_copy() {
;
}

こんなにちがうとは。
昔は、中に書くのは遅いからと思っていたが、
すっかり忘れていた。


では、昨日806msかかっていたコードを書き直すと、


function poly() {
var args = poly.arguments;
if(args.length == 0)
this.a = [ 0 ];
else {
...
}

this.copy = poly_copy;
...
}

// コピー
function poly_copy() {
var r = new poly();
for(var i = 0; i < this.a.length; i++)
r.a[i] = this.a[i];
return r;
}

...

741msもかかっている。
あまり速くなっていない。