JavaScript重箱の隅  新JavaScript入門  JavaScript,Neo-Generation  掲示板  表紙
6. 演算(1)  8. まとめ(1) 
JavaScript 重箱の隅
Written 3/8/02
演算(2)
乗算と加算を比べてみましょう。
    //ループ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
 
やっぱりだいぶお得です。
first, prev, next, exit