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もかかっている。
あまり速くなっていない。