文字列キーと独自の「クラス」のインスタンスを JavaScript の値として使用して、単純な連想配列 (重複なし) を実装しようとしています。ハッシュ セットの予想される O(1) 動作、またはバランス ツリーとして実装されたセットの O(log n) アクセス時間に満足しています。
新しいプロパティを動的に追加するオブジェクトの単純な使用法に惹かれますが、私は Node.js を使用しており、非表示クラスの V8 最適化に遭遇しました ( V8 非表示クラスの説明はこちらを参照してください)。
オブジェクトでプロパティを使用した場合、V8 ランタイムは膨大な数のプロパティとその一時性に気付き、裏で非表示のクラスを JIT しようとするのをやめますか?
私は V8 コードを複製したので、私の質問に対する一番の答えと一緒に、それへのポインタを歓迎します。
ご協力いただきありがとうございます。
フォローアップ 1
@vyacheslav-egorov に感謝JSObject::AddFastProperty
します。リンクの下にガード コードが表示されます。さらにコードを掘り下げないと、新しいプロパティを挿入するたびに多くのオーバーヘッドが発生するように思えます。JSObject::AddFastProperty
もう呼び出されないようにするオブジェクトごとのモードのようなものがあると思います。そのため、大騒ぎせずにJSObject::AddProperty
まっすぐに呼び出します。JSObject::AddSlowProperty
オブジェクトをそのモードにプッシュするために何かをする必要がありますか? それとも、V8 ランタイムは独自のメトリックを使用して確実にオブジェクトを切り替えますか?
if ((!name->IsSymbol() && !IsIdentifier(isolate->unicode_cache(), name)
&& name != isolate->heap()->hidden_string()) ||
(map()->unused_property_fields() == 0 &&
TooManyFastProperties(properties()->length(), store_mode))) {