乗算と加算を比べてみましょう。
//ループ0 整数加算
var start_t = new Date();
var l, m, n;
l = m = 2;
for(var j = 20000000; j; j--)
n = l + m;
return (new Date() - start_t) / 1000;
//ループ1 整数乗算
var start_t = new Date();
var l, m, n;
l = m = 2;
for(var j = 20000000; j; j--)
n = l * m;
return (new Date() - start_t) / 1000;
scripts/bench020a.js
scripts/bench020b.js
t0 : -85.47947408043885
ループ0 : 8.68
ループ1 : 9.45
ループ0 - ループ1 : -0.79 - -0.75
整数だと乗算のほうが時間がかかります。
//ループ2 実数乗算
var start_t = new Date();
var l, m, n;
l = m = 2.1;
for(var j = 20000000; j; j--)
n = l * m;
return (new Date() - start_t) / 1000;
scripts/bench021a.js
scripts/bench021b.js
t0 : -68.42368014601042
ループ1 : 9.4
ループ2 : 9.56
ループ1 - ループ2 : -0.16 - -0.15
整数の乗算より実数の乗算のほうが少し時間がかかります。
というか
前ページの数字と比べると
実数では乗算より加算のほうが少し時間がかかっているような。
//ループ3 実数加算
var start_t = new Date();
var l, m, n;
l = m = 2.1;
for(var j = 20000000; j; j--)
n = l + m;
return (new Date() - start_t) / 1000;
scripts/bench027a.js
scripts/bench027b.js
t0 : 21.843216673807124
ループ3 : 9.69
ループ2 : 9.49
ループ3 - ループ2 : 0.18 - 0.22
やっぱりそうですね。どう解釈すればいいのでしょう。
当然のことながら整数の場合2のべき乗をかけるときはビットシフトを使うとお得です。
//ループ4 左ビットシフト
var start_t = new Date();
var l, m, n;
l = 2;
m = 1;
for(var j = 20000000; j; j--)
n = l << m;
return (new Date() - start_t) / 1000;
scripts/bench022a.js
scripts/bench022b.js
t0 : 35.90166266400329
ループ1 : 9.51
ループ4 : 9.18
ループ1 - ループ4 : 0.32 - 0.36
次に除算についてみてみましょう。
//ループ5 整数除算
var start_t = new Date();
var l, m, n;
l = m = 2;
for(var j = 20000000; j; j--)
n = l / m;
return (new Date() - start_t) / 1000;
scripts/bench023a.js
scripts/bench023b.js
t0 : -185.2861563951713
ループ1 : 9.41
ループ5 : 11.63
ループ1 - ループ5 : -2.25 - -2.19
整数の除算は乗算に比べて非常に時間がかかります。どうしたことでしょう。
実数の除算については、
//ループ6 実数除算
var start_t = new Date();
var l, m, n;
l = 1.1; m = 2.1;
for(var j = 20000000; j; j--)
n = l / m;
return (new Date() - start_t) / 1000;
scripts/bench024a.js
scripts/bench024b.js
t0 : -19.218109982314296
ループ2 : 9.44
ループ6 : 9.64
ループ2 - ループ6 : -0.22 - -0.18
実数の場合、除算のほうが乗算よりちょっと時間がかかります。
これくらいなら解釈可能ですね。
除算もビットシフトに置き換えができることもあります。
//ループ7 右ビットシフト
var start_t = new Date();
var l, m, n;
l = 2;
m = 1;
for(var j = 20000000; j; j--)
n = l >> m;
return (new Date() - start_t) / 1000;
scripts/bench025a.js
scripts/bench025b.js
t0 : 39.50261340740631
ループ5 : 11.66
ループ7 : 8.81
ループ5 - ループ7 : 2.7 - 3
やっぱりだいぶお得です。