3

操作を比較すると

var fat_cats = cats.slice()

var fat_cats = new Array(cats.length)

パフォーマンスの違いは紛らわしいです。

firefox と chromenew Arrayでは速度が低下します (速度が向上するはずの場合は、空の配列を割り当てて反復処理を行わないだけです)。

IE8のようnew Arrayに高速です(これは混乱するだけです)

説明をいただければ幸いです。

基準

4

1 に答える 1

8

V8の配列関数のソースコードを見て、それを理解しました。

配列に 1000 を超える要素があり、.slice呼び出された場合、呼び出された関数SmartSliceが使用SimpleSliceされます。

SimpleSlicefor ループ コピーとして実装されます (配列コピー テスト ケースのコードとまったく同じです)。SmartSlice一方、スパース配列を使用してデータを表します。

要素数を 10,000 から 1000 未満に落としたテスト ケースでは、(誤差の範囲内で) まったく同じパフォーマンスですが、変動が少なく、要素数が 1000 を超える、より適切に制御されたテスト ケースでは、SmartSlice はメソッドは、ナイーブ コピーよりも ~36% 高速です。


これは V8 の側面を完全に説明していますが、同様の最適化が行われていない限り (おそらくすべてのスライス関数に対して)、サイズが小さい場合でも、スライスされた配列よりも新しい配列で Firefox が遅い理由はわかりません。

編集

これは私を悩ませ続けたので、私は Firefox のソースをダウンロードして をチェックアウトしました。Firefoxは同様js/src/jsarray.cpp!array_sliceの最適化を行っています。.sliceDenseCopiedArrayDenseAllocatedArray

于 2012-05-06T12:11:23.480 に答える