Properties V8是否会为用作关联数组的对象生成隐藏类?(大量财产)

Properties V8是否会为用作关联数组的对象生成隐藏类?(大量财产),properties,set,associative-array,v8,internals,Properties,Set,Associative Array,V8,Internals,我试图用字符串键和我自己的“类”实例作为JavaScript中的值来实现一个简单的关联数组(没有重复)。我对哈希集的预期O(1)行为或作为平衡树实现的集的O(logn)访问时间感到满意 我被一个对象的简单使用所吸引,我动态地向该对象添加了新属性,但我在Node.js上,遇到了V8隐藏类的优化() 如果我在一个对象上使用属性,V8运行时会注意到属性的数量和它们的临时性,并停止在幕后JIT隐藏的类吗 我刚刚克隆了V8代码,所以在回答我的问题的最上面一行的同时,也欢迎指向它的指针 谢谢你的帮助 跟进1

我试图用字符串键和我自己的“类”实例作为JavaScript中的值来实现一个简单的关联数组(没有重复)。我对哈希集的预期O(1)行为或作为平衡树实现的集的O(logn)访问时间感到满意

我被一个对象的简单使用所吸引,我动态地向该对象添加了新属性,但我在Node.js上,遇到了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))) {

是的,V8在注意到对象时会将对象属性切换为字典表示


多少是“太多”取决于几个因素(对象是如何创建的,最初有多少属性,属性是如何添加到对象的)。例如,如果一个对象被创建为空对象,则文字“太多”大约有30个属性。

谢谢Vyacheslav,对我的后续问题有什么想法?我假设在调用图中链接到更深层次的测试时,会按照您提到的方式自动启用早期的
JSObject::AddProperty
。。。安全的假设。对不起,只是有点迂腐。。。这个“简单”的问题已经研究太久了。感谢您的任何意见!:-)对不起,我想我的答案在
NormalizeProperties
。。。如果是这样,则无需回答。一旦对象被太多属性推入此模式,它将保持此模式(严格来说,有一种启发式方法可以返回快速模式:将慢速对象分配给某个函数的
原型
属性将其转换为快速模式)。如果您想尽早进入慢速模式(慢速模式被称为“慢速”是有原因的!),例如,您可以向对象添加一个具有非标识符名称的属性,或者添加一个属性,然后
删除它。此外,如果您在JavaScript之上实现某种语言(您说您将拥有自己的“类”)利用底层引擎中现有的优化比抵制它们更有意义。隐藏类的存在是有原因的。