JavaScript

Arrayの引数有り無し [ 2003/11/24 ]

他人のソース見てて気になったので計算の速さを調べてみた.何の速さかって言いますと

var a0 = new Array(1000);
var a1 = new Array();

Array の大きさを指定する場合と,指定しない場合」です.ということで比較プログラム↓

var N = 200000; // 配列の長さ(=ループ回数)
var t00, t01, t10, t11;

// 引数無し
{
    t00 = new Date().getTime();

    var a0 = new Array();
    for (var i = 0; i < N; i++)
        a0[i] = 0;

    t01 = new Date().getTime();
}

// 引数有り
{
    t10 = new Date().getTime();

    var a1 = new Array(N);
    for (var i = 0; i < N; i++)
        a1[i] = 0;

    t11 = new Date().getTime();
}

alert("引数無" + (t01 - t00) + "\n"
    + "引数有" + (t11 - t10));

結果はブラウザによって違います(Nがかなりでかいことに注意です).
NS7.1, Opera7.11はどちらもほぼ同じ,IE6は引数無しのほうが速い.

普通は引数指定したほうが早くなりそうなものですが,IE6の場合逆で,引数指定したほうが遅くなります.僕の環境では引数無しで3秒,引数有りで4秒でした.
配列のサイズ(=N)を大きくすればするほどこの差は顕著になってきます.
Nが比較的小さいなら結果は引数有り無しでどちらもほぼ同じになります.Nを小さくして(N=1000),上記プログラムを500回試行後の平均時間の結果より.

ということで結論,「可読性が上がるので通常はArrayの引数は書きましょう」
(配列のサイズがズバナでかく,速度が気になってきたら省いて良し!)

余談ですが,IE6で引数有りのほうが時間がかかることに関して,
んじゃIE6はnew Array(N)に時間がかかってんじゃないか(この時点で内部で配列を用意してるとか)と思われるかもしれませんが,

var COUNT = 500000;
var t00, t01, t10, t11;

{
    t00 = new Date().getTime();

    for (var i = 0; i < COUNT; i++)
        var a0 = new Array();

    t01 = new Date().getTime();
}
{
    t10 = new Date().getTime();

    for (var i = 0; i < COUNT; i++)
        var a1 = new Array(1000000);

    t11 = new Date().getTime();
}

alert("引数無" + (t01 - t00) + "\n"
    + "引数有" + (t11 - t10));

この結果はどちらも同じでした.う〜ん,謎.
まぁ,どのブラウザにでも共通して言えることは引数有りのコンストラクタでは内部で持っているlengthフィールドに引数を設定してるだけ.んで,IE6だけsetterメソッドでややこしいことしてる可能性があるってことですね.

JavaScript Diary Log