JavaScript重箱の隅  新JavaScript入門  JavaScript,Neo-Generation  掲示板  表紙
12. 文字列(4)  14. 配列(2) 
JavaScript 重箱の隅
Written 6/27/02
配列(1)
ここでは配列、というか Array オブジェクトについて扱います。
配列を使うとどれくらい遅いかを試します。
    //ループ1
    var start_t = new Date();
    var a = 1;
    for(var j = 10000000; j; j--)
        a;
    return (new Date() - start_t) / 1000;
    //ループ2
    var start_t = new Date();
    var a = [ 1 ];
    for(var j = 10000000; j; j--)
        a[0];
    return (new Date() - start_t) / 1000;
    scripts/bench067a.js
    scripts/bench067b.js
    t0 : -134.02962560770715
    ループ1 : 3.48
    ループ2 : 5.31
    ループ1 - ループ2 : -1.85 - -1.79
 
あれ?配列を使うとどうしようもなく遅くなると記憶していたんですが。 いつの間にか改善したんでしょうか。
配列の配列も見ておきましょう。
    //ループ3
    var start_t = new Date();
    var a = [ [ 1 ] ];
    for(var j = 10000000; j; j--)
        a[0][0];
    return (new Date() - start_t) / 1000;
    scripts/bench068a.js
    scripts/bench068b.js
    t0 : -141.40402526388857
    ループ2 : 5.3
    ループ3 : 6.99
    ループ2 - ループ3 : -1.71 - -1.66
 
差がさっきと同じくらいで、当然といえば当然の結果です。
今まで配列の配列を使うときは 配列(のアドレス)を変数に格納してから使うようにしていたのですが、 それも程度によるのでしょうか。
    //ループ4
    var start_t = new Date();
    var a = [ [ 1 ] ];
    for(var j = 5000000; j; j--) {
        a[0][0];
        a[0][0];
    }
    return (new Date() - start_t) / 1000;
    //ループ5
    var start_t = new Date();
    var a = [ [ 1 ] ];
    for(var j = 5000000; j; j--) {
        var b = a[0];
        b[0];
        b[0];
    }
    return (new Date() - start_t) / 1000;
    scripts/bench069a.js
    scripts/bench069b.js
    t0 : 20.136326613425815
    ループ4 : 5.68
    ループ5 : 5.45
    ループ4 - ループ5 : 0.21 - 0.25
 
2回使うと同じくらいになります。一応この手法は有効のようです。 ちなみに、b の定義の位置はループの外でも時間は変わりません。
length プロパティも見ておきましょう。
    //ループ6
    var start_t = new Date();
    var a = [ 1 ];
    for(var j = 10000000; j; j--)
        a.length;
    return (new Date() - start_t) / 1000;
    scripts/bench070a.js
    scripts/bench070b.js
    t0 : -250.2000000029597
    ループ2 : 5.27
    ループ6 : 5.69
    ループ2 - ループ6 : -0.42 - -0.41
 
少し遅いです。
配列が少し大きくなったときも見ておきましょう。
    //ループ7
    var start_t = new Date();
    var a = [ ];
    for(var j = 0; j < 100; j++)
        a[j] = 1;
    for(var j = 10000000; j; j--)
        a[99];
    return (new Date() - start_t) / 1000;
    scripts/bench071a.js
    scripts/bench071b.js
    t0 : -3.1911479775194333
    ループ2 : 5.31
    ループ7 : 5.34
    ループ2 - ループ7 : -0.05 - -0.01
 
変わらないですね。
でも、前に書いたことは全て成り立っているし、 単に高速化しただけかな?
first, prev, next, exit