JavaScript重箱の隅  新JavaScript入門  JavaScript,Neo-Generation  掲示板  表紙
7. 演算(2)  9. 文字列(1) 
JavaScript 重箱の隅
Written 3/12/02
まとめ(1)
インチキでもいいので1回の処理にかかる時間を計算してみました。
環境は、Windows ME・Athlon1.2GHz・Windows Script5.6です。

1. 代入x = n120ns
2. 文字列の直接代入x = "a"190ns
3. インクリメントn++140ns
4. 整数加算n = n + m170ns
5. 整数乗算n = l * m210ns
6. 整数除算n = l / m320ns
7. 実数加算n = n + m220ns
8. 実数乗算n = l * m210ns
9. 実数除算n = l / m220ns
10. ビットごとのAndn &= m180ns
11. 左ビットシフトn = l << m190ns
12. 右ビットシフトn = l >> m180ns

ここからうかがえることは、 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;
 
といったまとめた式が速いのはうなづけるでしょう。
first, prev, next, exit