操作を比較すると
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されます。
SimpleSlicefor ループ コピーとして実装されます (配列コピー テスト ケースのコードとまったく同じです)。SmartSlice一方、スパース配列を使用してデータを表します。
要素数を 10,000 から 1000 未満に落としたテスト ケースでは、(誤差の範囲内で) まったく同じパフォーマンスですが、変動が少なく、要素数が 1000 を超える、より適切に制御されたテスト ケースでは、SmartSlice はメソッドは、ナイーブ コピーよりも ~36% 高速です。
これは V8 の側面を完全に説明していますが、同様の最適化が行われていない限り (おそらくすべてのスライス関数に対して)、サイズが小さい場合でも、スライスされた配列よりも新しい配列で Firefox が遅い理由はわかりません。
編集
これは私を悩ませ続けたので、私は Firefox のソースをダウンロードして をチェックアウトしました。Firefoxは同様js/src/jsarray.cpp!array_sliceの最適化を行っています。.sliceDenseCopiedArrayDenseAllocatedArray