だいたいの反復処理は 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の配列って多分中身ハッシュマップよね
日記 (おまけ)
今日はあんまりめんたるよくなかった