JScript高速化(9)

まとめの後半。

6. 組込みオブジェクトを拡張すると速くなることがある


Array.prototype.copy = poly_copy;

function poly_copy(p) {
...
}

このようにすると、Arrayにcopyメソッドが追加される。
ユーザ定義型より組込み型のほうが速いときは、
こうすると速い。

7. プロパティの参照はなるべく少なく


p.a
p["a"]

この2つは等価である。
つまりプロパティはたぶんハッシュで、
プロパティの参照は遅い。


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

より、


var ra = r.a;
var pa = p.a;
for(var i = 0; i < 10; i++)
ra[i] =pa[i];

のほうが速い。

8. argumentsオブジェクトの遅さには回避策がある

関数の可変個の引数を取るのに
次のようにargumentsオブジェクトを使う。


function hoge() {
var args= hoge.arguments;
for(var i = 0; i < args.length; i++) {
// args[i]として個々の引数を取り出して処理する
}
}

しかし、argumentsオブジェクトは参照だけでも非常に遅い。
引数の個数が特定のときが大半の場合は、
この遅さを回避できる。
たとえば、引数が0個のときばかりなら、


function hoge(a) {
if(a == undefined)
// 引数が0個のときの処理
else {
var args= hoge.arguments;
for(var i = 0; i < args.length; i++) {
...
}
}
}

とすれば、argumentsオブジェクトに触らなくてよくなり
高速化できる。

9. this[i]は不可、this[""+i]は可

と思っていたが、
いまやって見るとできる。
どうやら別にエラーがあったらしい。