配列を空にする方法とそのプロファイリングを取ってみた
こんにちは. 研究でJSの配列を空にする必要があったので,そのメモ.
空にする方法
空にする方法を2つ考えることができた.
lengthプロパティに0を代入する
し,信じられないことにJSでは配列オブジェクトのlengthプロパティに0を代入すると配列が空になるのだ.
var hoge = [1, 2, 3]; hoge.length = 0; console.log(hoge); // []
spliceメソッドで全部取り出す
他に考えられる方法としてspliceメソッドで全部取り出すというもの.
var hoge = [1, 2, 3]; hoge.splice(0, hoge.length); // インデックス0からlengthプロパティ分取り出す console.log(hoge); // []
プロファイリングを取ってみよう
今回はNodeだけで計測する. 以下のプログラムを実行する. 前回同様に5回計測して,その中央値を採用する.
var start_time; var time_elapsed; var hoge; var counts = []; for (var i = 0; i < 5; i++) { start_time = new Date().getTime(); time_elapsed = 0; hoge = []; for (var j = 0; j < 10000; j++) { hoge.push(i); } for (var iters = 0; time_elapsed < 1000; iters++) { // hoge.length = 0; hoge.splice(0, hoge.length); time_elapsed = new Date().getTime() - start_time; } counts.push(iters); console.log('...'); } counts.sort(); console.log(counts[2]);
結果
lengthプロパティに0を代入 | spliceメソッドで全て取り出す |
---|---|
5241693 | 3959621 |
結論
lengthプロパティに0を代入するほうが効率がよい. 理由は? はっきりとはわからないけど,spliceメソッドは返り値に配列を返す. lengthプロパティのほうは代入のみ. そのあたりで差が出るのではないだろうか.