2

文字列キーと独自の「クラス」のインスタンスを 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))) {
4

1 に答える 1

2

はい、V8 は、オブジェクトのプロパティが多すぎることに気付くと、オブジェクトのプロパティを辞書表現に切り替えます。

「多すぎる」数は、いくつかの要因 (オブジェクトがどのように作成されたか、最初に持っていたプロパティの数、オブジェクトにどのようにプロパティが追加されたか) によって異なります。たとえば、オブジェクトが空のオブジェクト リテラルとして作成された場合、"多すぎる" のは約 30 個のプロパティになります。

于 2013-04-20T20:26:04.497 に答える