めぐの JavaScript 日記

あーもんど

配列の初期化は for 文でやると高速

だいたいの反復処理は for 文でやるのが (多分) 最速ですが,配列の初期化も for で一個ずつ要素の値を入れていくのが王道のようです。もっと良いやり方あるかもしれないけど

1万個の要素を持つ配列を10万回生成する

いくつか思いついた方法を比較します。実行環境によって順位は前後しそうです。私は Node.js でやりました。

コード

// 10万回繰り返して実行時間を測る
const measure = f => {
    const x = Date.now();
    for (let i = 0; i < 1e5; ++i) f(i);
    console.log(Date.now() - x, "ms");
};
 
// ジェネレータを展開する
// 83816 ms
measure(() => {
    let arr = [...function* () {
        for (let i = 0; i < 10000; ++i) yield i;
    }()];
    arr;
});
 
// Array.from() を使う
// 65753 ms
measure(() => {
    let arr = Array.from(Array(10000), (_, i) => i);
    arr;
});
 
// undefined 配列をマップする
// 8409 ms
measure(() => {
    let arr = [...new Array(10000)].map((_, i) => i);
    arr;
});
 
// 空の配列に push する
// 7339 ms
measure(() => {
    let arr = [];
    for (let i = 0; i < 10000; ++i) arr.push(i);
    arr;
});
 
// コンストラクタで作って for 文で要素を代入
// 2594 ms
measure(() => {
    let arr = new Array(10000);
    for (let i = 0; i < arr.length; ++i) arr[i] = i;
    arr;
});
 
// リテラルで作って length をセットして for 文で要素を代入
// 1989 ms (最速)
measure(() => {
    let arr = [];
    arr.length = 10000;
    for (let i = 0; i < arr.length; ++i) arr[i] = i;
    arr;
});

ブラウザでやっても for が最速でした。関数化しとくとよさそう。
JSの配列って多分中身ハッシュマップよね

日記 (おまけ)

今日はあんまりめんたるよくなかった