JavaScriptの配列とオブジェクト(特にGoogle V8)に関連するパフォーマンスは、文書化すると非常に興味深いものになります。このトピックに関する包括的な記事はインターネットのどこにもありません。
一部のオブジェクトは、基礎となるデータ構造としてクラスを使用することを理解しています。プロパティが多数ある場合、ハッシュテーブルとして扱われることがありますか?
また、配列がC ++配列のように扱われる場合があることも理解しています(つまり、高速なランダムインデックス付け、削除の遅延、サイズ変更)。また、オブジェクトのように扱われる場合もあります(高速なインデックス作成、高速な挿入/削除、より多くのメモリ)。そして、時々それらはリンクされたリストとして保存されるかもしれません(すなわち、遅いランダムなインデックス付け、最初/最後の速い削除/挿入)
JavaScriptでの配列/オブジェクトの取得と操作の正確なパフォーマンスは何ですか?(特にGoogle V8の場合)
より具体的には、それがパフォーマンスに与える影響:
- オブジェクトにプロパティを追加する
- オブジェクトからプロパティを削除する
- オブジェクトのプロパティにインデックスを付ける
- 配列に項目を追加する
- 配列からアイテムを削除する
- 配列内のアイテムにインデックスを付ける
- Array.pop()を呼び出す
- Array.push()を呼び出す
- Array.shift()の呼び出し
- Array.unshift()の呼び出し
- Array.slice()の呼び出し
詳細についての記事やリンクも同様にいただければ幸いです。:)
編集:私は本当にJavaScriptの配列とオブジェクトが内部でどのように機能するのか疑問に思っています。また、V8エンジンは別のデータ構造に「切り替える」ことをどのような状況で「知っている」のでしょうか。
たとえば、次のような配列を作成するとします...
var arr = [];
arr[10000000] = 20;
arr.push(21);
ここで何が起こっているのですか?
または...これは... ???
var arr = [];
//Add lots of items
for(var i = 0; i < 1000000; i++)
arr[i] = Math.random();
//Now I use it like a queue...
for(var i = 0; i < arr.length; i++)
{
var item = arr[i].shift();
//Do something with item...
}
従来のアレイの場合、パフォーマンスはひどいものになります。一方、LinkedListが使用された場合...それほど悪くはありません。