| 1. | 代入 | x = n | 120ns |
| 2. | 文字列の直接代入 | x = "a" | 190ns |
| 3. | インクリメント | n++ | 140ns |
| 4. | 整数加算 | n = n + m | 170ns |
| 5. | 整数乗算 | n = l * m | 210ns |
| 6. | 整数除算 | n = l / m | 320ns |
| 7. | 実数加算 | n = n + m | 220ns |
| 8. | 実数乗算 | n = l * m | 210ns |
| 9. | 実数除算 | n = l / m | 220ns |
| 10. | ビットごとのAnd | n &= m | 180ns |
| 11. | 左ビットシフト | n = l << m | 190ns |
| 12. | 右ビットシフト | n = l >> m | 180ns |
ここからうかがえることは、 1. の代入がどんな型の値でもほとんど変わらないことから、 これは値ではなく、アドレスを代入しているのでは。 すなわち、
a = 1;
b = a;
とすると、a と b は同じアドレスを指すことになります。
下手すると、1 という数値も同じアドレスを指しているのかもしれません。
a++;
という処理をさらに行ったとき、a は単にインクリメントしたのではなく、
別のアドレスを指すことになります。
//ループ0 何もしない
var start_t = new Date();
for(var j = 20000000; j; j--)
;
return (new Date() - start_t) / 1000;
//ループ1 ?
var start_t = new Date();
var a = 1;
for(var j = 20000000; j; j--)
a;
return (new Date() - start_t) / 1000;
scripts/bench028a.js
scripts/bench028b.js
t0 : -162.50944895474126
ループ0 : 5.22
ループ1 : 6.94
ループ0 - ループ1 : -1.74 - -1.69
このループ1は何をやっているのかよく分かりませんが(アドレスの評価?)、
これで代入の7割くらいの時間を食っているので、
a = l + m + n;
a = b = c;
といったまとめた式が速いのはうなづけるでしょう。