2016-07-12 4 views
0

配列とオブジェクトの速度の違いを知りたいので、配列とオブジェクトから100,000個のアイテムを塗りつぶし、アクセス、削除するテストを設定しました。アクセスと配列の充填は約3msの差でほぼ等しかった。しかし、アレイから削除すると、604msの差(10ms対614ms)になりました。どうしてこれなの?オブジェクトと配列はほとんど同じだと思った。スプライシング配列よりも速くオブジェクトから削除するのはなぜですか?

デモ:あなたは.splice()ことを行うとhttps://codecanister.com/Project/b9f8de7c/1/result/

+1

関数呼び出しは高価です! 'delete'キーワードと' .splice'関数の間には大きな違いがあります。 – undefined

+0

時間測定にDateを使用しないでください。代わりに 'performance.now();'を使用してください。 – Mick

+0

それを更新しましたが、まだ約600msの違いがあります。 – jlynch630

答えて

2

、後続のすべての配列エントリを再割り当てする必要があります。つまり、スプライスされた後のすべてのプロパティ名を変更する必要があります。プロパティの直線的なトラバーサルを除いて、それを行う良い方法はありません。その操作を速くするデータ構造によって、他のより一般的な操作が遅くなります。

配列[1, 2, 3, 4]を考えてみましょう。プロパティ "0"の値は1です。そのエントリをスプライスする場合、ランタイムはプロパティ "0"を2に、プロパティ "1"を3に、プロパティ "2"を4に設定する必要があります。

0

異なるアクションを実行するだけです。 "delete"は配列の位置をundefinedに設定するだけです。スプライスはあなたの配列のすべての10,000個の項目に対してarr [i] = arr [i + 1]をループして完全に除去します。 10.000すべてのアイテムでこれを行います。参照:this question

+0

"あなたのオブジェクト" obj "が配列である限り、" ---それは? – zerkms

+1

"" delete "は配列の位置をundefinedに設定するだけです---配列に穴ができます。 – zerkms

+0

foreachとmap関数によって位置が無視されるため、未定義に設定するだけとは異なります。 – bormat

関連する問題