JScript高速化(8)

ここでいったんまとめを。
Arrayオブジェクトの拡張というのはちょっと気持ち悪いから、
本当は継承できたらいいのだが、
どうもうまくいかないし、
できても遅そうなので追究はしない。

まとめ

1. Arrayのpushは使うな
2. Arrayのコンストラクタは[ ]を使うべし
3. Arrayの構築のコスト大からは逃れられない
4. オブジェクトのメソッドは外に出すべし
5. メソッドの代入にはprototypeを使う
6. 組込みオブジェクトを拡張すると速くなることがある
7. プロパティの参照はなるべく少なく
8. argumentsオブジェクトの遅さには回避策がある
9. this[i]は不可、this[""+i]は可
10. thisを普通の変数に代入すれば配列の要素に参照できる

1. Arrayのpushは使うな


a.push(b);

は書くほうも読むほうも気分がよいが、遅い。


a[a.length] = b;

の方が、倍速い。
もちろん、


a[i] = b;

の方が速い。
メソッドを使うとだいたい遅い。


a = b.slice(0);

よりも、


var a = [ ];
for(var i = b.length - 1; i >= 0; i--)
a[i] = b[i];

のほうが速い。

2. Arrayのコンストラクタは[ ]を使うべし


var a = new Array();

より、


var a = [ ];

は少し速い。
気持ちがいいし、こちらを使おう。
ちなみに、


var a = new Array(10);

としても、10個領域を確保するのではないため、速くならない。
Arrayは配列ではなく、恐らくハッシュである。

3. Arrayの構築のコスト大からは逃れられない


var a = [ ];
for(var i = 0; i < 10; i++)
a[i] = i;

とすると、a.0、a.1と次々にプロパティを生成していくので遅い。
しかし、これに回避策はない。

4. オブジェクトのメソッドは外に出すべし


function poly() {
this.copy = function(p) {
...
}
...
}

と書くより、


function poly() {
this.copy = poly_copy;
...
}

function poly_copy(p) {
...
}
...

と書いたほうが速い。

5. メソッドの代入にはprototypeを使う


poly.protype.copy = poly_copy;

function poly() {
...
}

function poly_copy(p) {
...
}
...

と書いたほうがさらに速い。