JavaScript重箱の隅  新JavaScript入門  JavaScript,Neo-Generation  掲示板  表紙
9. 文字列(1)  11. 
JavaScript 重箱の隅
Written 5/11/02
文字列(2)
次に文字列の結合の個数を増やしていくとどうなるか調べました。
    //ループ1
    var start_t = new Date();
    var s;
    for(var j = 2000000; j; j--)
        s = "a" + "b";
    return (new Date() - start_t) / 1000;
    
    //ループ2
    var start_t = new Date();
    var s;
    for(var j = 2000000; j; j--)
        s = "a" + "b" + "c";
    return (new Date() - start_t) / 1000;
    
    //ループ3
    var start_t = new Date();
    var s;
    for(var j = 2000000; j; j--)
        s = "a" + "b" + "c" + "d";
    return (new Date() - start_t) / 1000;
    
    scripts/bench034a.js
    scripts/bench034b.js
    t0 : -159.06904821237907
    ループ1 : 2.92
    ループ2 : 4.89
    ループ1 - ループ2 : -1.99 - -1.94
    
    scripts/bench035a.js
    scripts/bench035b.js
    t0 : -285.50395196771944
    t0 : -159.06904821237907
    ループ1 : 2.95
    ループ3 : 7.09
    ループ1 - ループ3 : -4.18 - -4.11
 
とにかく文字列の結合という操作自体に非常に時間がかかるようです。
同様の機能の concat メソッドも試してみましょう。
    //ループ4 concat
    var start_t = new Date();
    var s;
    for(var j = 2000000; j; j--)
        s = "a".concat("b", "c", "d");
    return (new Date() - start_t) / 1000;
    
    scripts/bench050a.js
    scripts/bench050b.js
    t0 : -67.79920773493767
    ループ3 : 7.15
    ループ4 : 9.95
    ループ3 - ループ4 : -2.89 - -2.71
 
非常に遅いですね。役に立たん。
とにかく、文字列の結合は遅いし代替手段もないと言えそうです。
次に、部分文字列を取ることを考えましょう。
まず、charAt と substring です。
    //ループ5 charAt
    var start_t = new Date();
    var s = "0123456789";
    var t;
    for(var j = 2000000; j; j--)
        t = s.charAt(0);
    return (new Date() - start_t) / 1000;
    
    //ループ6 substring
    var start_t = new Date();
    var s = "0123456789";
    var t;
    for(var j = 2000000; j; j--)
        t = s.substring(0, 1);
    return (new Date() - start_t) / 1000;
    
    scripts/bench051a.js
    scripts/bench051b.js
    t0 : -69.52706567577165
    ループ5 : 5.45
    ループ6 : 6.03
    ループ5 - ループ6 : -0.6 - -0.56
 
charAt と substring は想像では引数の個数の差が出ると思ったのですが、
    //ループ7 substring
    var start_t = new Date();
    var s = "0123456789";
    var t;
    for(var j = 2000000; j; j--)
        t = s.substring(9);
    return (new Date() - start_t) / 1000;
    
    scripts/bench052a.js
    scripts/bench052b.js
    t0 : -26.172413793239364
    ループ5 : 5.49
    ループ7 : 5.74
    ループ5 - ループ7 : -0.27 - -0.23
 
引数の数が1つずつでも差があるのですね。 引数が1つでも2つでもあまり差がないのが意外。
似たようなメソッドの slice と substr も調べて見ましょう。
    //ループ8 slice
    var start_t = new Date();
    var s = "0123456789";
    var t;
    for(var j = 2000000; j; j--)
        t = s.slice(0, -9);
    return (new Date() - start_t) / 1000;
    
    scripts/bench053a.js
    scripts/bench053b.js
    t0 : -2.9042375118167367
    ループ6 : 6
    ループ8 : 6.04
    ループ6 - ループ8 : -0.06 - -0.01
    
    //ループ9 substr
    var start_t = new Date();
    var s = "0123456789";
    var t;
    for(var j = 2000000; j; j--)
        t = s.substr(0, 1);
    return (new Date() - start_t) / 1000;
    
    scripts/bench054a.js
    scripts/bench054b.js
    t0 : 5.076730825647265
    ループ6 : 6
    ループ9 : 5.95
    ループ6 - ループ9 : 0.03 - 0.07
 
微妙に違うという結果ですが、まあ同じと考えてよいでしょう。
indexOf 系についてもどれくらい時間がかかるか見ておきましょう。
    //ループ10
    var start_t = new Date();
    var s = "0123456789";
    var n;
    for(var j = 2000000; j; j--)
        n = s.indexOf("9");
    return (new Date() - start_t) / 1000;
    
    //ループ11
    var start_t = new Date();
    var s = "0123456789";
    var n;
    for(var j = 2000000; j; j--)
        n = s.lastIndexOf("9");
    return (new Date() - start_t) / 1000;
    
    scripts/bench056a.js
    scripts/bench056b.js
    t0 : 1.3287276776587666
    ループ10 : 4.15
    ループ11 : 4.13
    かかった時間に差があるとはいえない
 
当然ですが、substring 系よりは時間がかからないということです。 あと、前から検索しても後ろからでもほとんど同じです。
最後に、length プロパティを得るのにどれだけ時間がかかるかみておきましょう。
    //ループ12
    var start_t = new Date();
    var s = "0123456789";
    var n;
    for(var j = 2000000; j; j--)
        n = s.length;
    return (new Date() - start_t) / 1000;
    
    //ループ0
    var start_t = new Date();
    for(var j = 2000000; j; j--)
        ;
    return (new Date() - start_t) / 1000;
    
    scripts/bench055a.js
    scripts/bench055b.js
    t0 : -92.99164885313244
    a : 0.53
    b : 1.41
    ma - mb : -0.91 - -0.87
    t0 : 3.6682420857888966
    ループ0  : 0.53
    ループ12 : 1.41
    ループ0 - ループ12 : -0.91 - -0.87
 
プロパティを得るだけでこれだけ時間がかかるという恐ろしい例です。
first, prev, next, exit