properties - V8 会为用作关联数组的对象生成隐藏类吗? (大量特性)

标签 properties set associative-array v8 internals

我正在尝试使用字符串键和我自己的“类”实例作为 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/

相关文章:

javascript - 无法访问 JavaScript 关联数组中的项目

objective-c - 为 Objective-c 中的每个项目创建具有属性的数组

oracle - 在子句中使用Oracle表类型-编译失败

objective-c - 在 '' 类型的对象上找不到属性 'id'

math - 函数式编程中的求和

set - 谷歌网页字体自定义字符集

mongodb - 如何使用计算值在 MongoDB 中批量更新服务器上的文档?

php - 将变量名称和内容保存到php中的关联数组中

c# - 在 C# 中是否有可能知道谁调用了静态属性/访问器?

qt - 如何动态创建Q_Properties