JScript高速化(11)

型の判別

加算は、引数に数値と多項式が取れるようにしている。


this.add = function(p) {
var r = new poly(); // 返り値の準備
if(typeof p == "number") {
// 引数が数値だったときの処理
}
else if(p instanceof poly) {
// 多項式だったときの処理
}
else {
// その他のときの処理
}
return r;
}

型を判別するための演算子が2つある。


typeof p

とすると、pの基底のクラス名の文字列、
"number", "string", "boolean", "object", "function"、
あるいは、"undefined"が返るようだ。


p instanceof poly

とすると、
pがpolyかどうかがtrue, falseで返る。
これがtrueなら、
上のpolyのところはその基底クラスでもtrueが返る。


p instanceof Object


この演算子はどれくらい時間がかかるかというと、
100万回(いつもより1桁多い)繰り返すと、


// 708ms
var p = new poly();
for(var i = 0; i < n; i++) {
p instanceof Object;
}


// 713ms
var p = new poly();
for(var i = 0; i < n; i++) {
p instanceof Array;
}


// 645ms
var p = new poly();
for(var i = 0; i < n; i++) {
typeof p == "object";
}

instanceofは、
どうも基底クラスを使ったほうが若干速いようだが、
変わらないと言っていいだろう。
それよりtypeofのほうを使ったほうが速いようだが、
そんなに気にするようなレベルではない。


typeofを使うと文字列の比較に時間がかかる。
こうすると速くなる。


// 469ms
var o = "object";
var p = new poly();
for(var i = 0; i < n; i++) {
typeof p == o;
}

といってもそうたいしたことはないし、
この部分は特に変更しない。