配列を使うとどれくらい遅いかを試します。
//ループ1
var start_t = new Date();
var a = 1;
for(var j = 10000000; j; j--)
a;
return (new Date() - start_t) / 1000;
//ループ2
var start_t = new Date();
var a = [ 1 ];
for(var j = 10000000; j; j--)
a[0];
return (new Date() - start_t) / 1000;
scripts/bench067a.js
scripts/bench067b.js
t0 : -134.02962560770715
ループ1 : 3.48
ループ2 : 5.31
ループ1 - ループ2 : -1.85 - -1.79
あれ?配列を使うとどうしようもなく遅くなると記憶していたんですが。
いつの間にか改善したんでしょうか。
配列の配列も見ておきましょう。
//ループ3
var start_t = new Date();
var a = [ [ 1 ] ];
for(var j = 10000000; j; j--)
a[0][0];
return (new Date() - start_t) / 1000;
scripts/bench068a.js
scripts/bench068b.js
t0 : -141.40402526388857
ループ2 : 5.3
ループ3 : 6.99
ループ2 - ループ3 : -1.71 - -1.66
差がさっきと同じくらいで、当然といえば当然の結果です。
今まで配列の配列を使うときは
配列(のアドレス)を変数に格納してから使うようにしていたのですが、
それも程度によるのでしょうか。
//ループ4
var start_t = new Date();
var a = [ [ 1 ] ];
for(var j = 5000000; j; j--) {
a[0][0];
a[0][0];
}
return (new Date() - start_t) / 1000;
//ループ5
var start_t = new Date();
var a = [ [ 1 ] ];
for(var j = 5000000; j; j--) {
var b = a[0];
b[0];
b[0];
}
return (new Date() - start_t) / 1000;
scripts/bench069a.js
scripts/bench069b.js
t0 : 20.136326613425815
ループ4 : 5.68
ループ5 : 5.45
ループ4 - ループ5 : 0.21 - 0.25
2回使うと同じくらいになります。一応この手法は有効のようです。
ちなみに、b の定義の位置はループの外でも時間は変わりません。
length プロパティも見ておきましょう。
//ループ6
var start_t = new Date();
var a = [ 1 ];
for(var j = 10000000; j; j--)
a.length;
return (new Date() - start_t) / 1000;
scripts/bench070a.js
scripts/bench070b.js
t0 : -250.2000000029597
ループ2 : 5.27
ループ6 : 5.69
ループ2 - ループ6 : -0.42 - -0.41
少し遅いです。
配列が少し大きくなったときも見ておきましょう。
//ループ7
var start_t = new Date();
var a = [ ];
for(var j = 0; j < 100; j++)
a[j] = 1;
for(var j = 10000000; j; j--)
a[99];
return (new Date() - start_t) / 1000;
scripts/bench071a.js
scripts/bench071b.js
t0 : -3.1911479775194333
ループ2 : 5.31
ループ7 : 5.34
ループ2 - ループ7 : -0.05 - -0.01
変わらないですね。
でも、
前に書いたことは全て成り立っているし、
単に高速化しただけかな?