我正在尝试使用字符串键和我自己的“类”实例作为 JavaScript 中的值来实现一个简单的关联数组(无重复)。我对哈希集的预期 O(1) 行为或作为平衡树实现的集合的 O(log n) 访问时间感到满意。
我喜欢动态添加新属性的对象的简单使用,但我使用的是 Node.js,并且遇到了隐藏类的 V8 优化 ( see description of V8 hidden classes here )。
如果我确实在对象上使用属性,V8 运行时是否会注意到属性的绝对数量及其 transient 性,并停止尝试在幕后 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))) {
最佳答案
是的,当 V8 注意到对象 has too many properties 时,它会将对象属性切换为字典表示形式。 。
多少是“太多”取决于几个因素(对象是如何创建的、它最初有多少属性、如何将属性添加到对象中)。例如,如果一个对象被创建为空对象文字,“太多”将是大约 30 个属性。
关于properties - V8 会为用作关联数组的对象生成隐藏类吗? (大量特性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16124556/