操作を比較すると
var fat_cats = cats.slice()
に
var fat_cats = new Array(cats.length)
パフォーマンスの違いは紛らわしいです。
firefox と chromenew Array
では速度が低下します (速度が向上するはずの場合は、空の配列を割り当てて反復処理を行わないだけです)。
IE8のようnew Array
に高速です(これは混乱するだけです)
説明をいただければ幸いです。
操作を比較すると
var fat_cats = cats.slice()
に
var fat_cats = new Array(cats.length)
パフォーマンスの違いは紛らわしいです。
firefox と chromenew Array
では速度が低下します (速度が向上するはずの場合は、空の配列を割り当てて反復処理を行わないだけです)。
IE8のようnew Array
に高速です(これは混乱するだけです)
説明をいただければ幸いです。
V8の配列関数のソースコードを見て、それを理解しました。
配列に 1000 を超える要素があり、.slice
呼び出された場合、呼び出された関数SmartSlice
が使用SimpleSlice
されます。
SimpleSlice
for ループ コピーとして実装されます (配列コピー テスト ケースのコードとまったく同じです)。SmartSlice
一方、スパース配列を使用してデータを表します。
要素数を 10,000 から 1000 未満に落としたテスト ケースでは、(誤差の範囲内で) まったく同じパフォーマンスですが、変動が少なく、要素数が 1000 を超える、より適切に制御されたテスト ケースでは、SmartSlice はメソッドは、ナイーブ コピーよりも ~36% 高速です。
これは V8 の側面を完全に説明していますが、同様の最適化が行われていない限り (おそらくすべてのスライス関数に対して)、サイズが小さい場合でも、スライスされた配列よりも新しい配列で Firefox が遅い理由はわかりません。
編集
これは私を悩ませ続けたので、私は Firefox のソースをダウンロードして をチェックアウトしました。Firefoxは同様js/src/jsarray.cpp!array_slice
の最適化を行っています。.slice
DenseCopiedArray
DenseAllocatedArray