配列を空にする方法とそのプロファイリングを取ってみた

こんにちは. 研究で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プロパティのほうは代入のみ. そのあたりで差が出るのではないだろうか.