色々な演算を試してみました。
//ループ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 n = 0;
for(var j = 20000000; j; j--)
n++;
return (new Date() - start_t) / 1000;
//ループ2 整数加算
var start_t = new Date();
var n = 0;
var m = 1;
for(var j = 20000000; j; j--)
n = n + m;
return (new Date() - start_t) / 1000;
//ループ3 加算代入
var start_t = new Date();
var n = 0;
var m = 1;
for(var j = 20000000; j; j--)
n += m;
return (new Date() - start_t) / 1000;
//ループ4 浮動小数点数加算代入
var start_t = new Date();
var f = 1.2345;
var g = 1.2345;
for(var j = 20000000; j; j--)
f += g;
return (new Date() - start_t) / 1000;
//ループ5 ビットごとのAND代入
var start_t = new Date();
var n = 0;
var m = 1;
for(var j = 20000000; j; j--)
n &= m;
return (new Date() - start_t) / 1000;
//ループ6 加算2回
var start_t = new Date();
var n = 0;
var m = 1;
for(var j = 20000000; j; j--)
n += m + m;
return (new Date() - start_t) / 1000;
まず、何もしないループ0とインクリメントするループ1を比べます。
scripts/bench014a.js
scripts/bench014b.js
t0 : -317.84298640339284
ループ0 : 5.29
ループ1 : 8.07
ループ0 - ループ1 : -2.8 - -2.76
たかがインクリメントなのに時間がかかります。
インクリメントしているだけじゃないことがうかがえます。
代入よりも少しかかってます。
インクリメントよりは加算の方が時間がかかります。
scripts/bench015a.js
scripts/bench015b.js
t0 : -7.407871526243013
ループ1 : 8.07
ループ2 : 8.67
ループ1 - ループ2 : -0.76 - -0.42
代入加算は単純な場合効果はないようです。
scripts/bench016a.js
scripts/bench016b.js
t0 : 1.1547005383849435
ループ2 : 8.67
ループ3 : 8.66
かかった時間に差があるとはいえない
整数の加算よりは実数の加算の方が時間がかかります。
scripts/bench017a.js
scripts/bench017b.js
t0 : -97.20759464031854
ループ3 : 8.67
ループ4 : 9.82
ループ3 - ループ4 : -1.18 - -1.13
ビット演算の&はなぜか加算より遅くなってます。
scripts/bench018a.js
scripts/bench018b.js
t0 : -17.034488982759057
ループ3 : 8.64
ループ5 : 8.85
ループ3 - ループ5 : -0.23 - -0.18
まとめて加算するとかなりお得なので、まとめられるものはまとめましょう。
scripts/bench019a.js
scripts/bench019b.js
t0 : -92.48836933145246
ループ3 : 8.62
ループ6 : 9.41
ループ3 - ループ6 : -0.8 - -0.77