因此,我已经在公共Wiki上广泛阅读了V8引擎,并获得了隐藏类如何查找属性的概念。 v8 design elements

但是,我真正没有得到的是这比散列表要快。

c++ - V8引擎中的隐藏类如何实现?-LMLPHP

据此,它的属性存储在不同的偏移量中,但是对于每个偏移量,您必须检查其正确的属性。那么,是否意味着您必须在最坏的情况下遍历所有属性才能为所需的属性获得正确的偏移量?

由于哈希表是恒定时间查找的,因此它们会比通常更快吗?

最佳答案

您的问题似乎通过hereherehere的某种组合得到了回答。

简要地,根据我对这些链接的理解:

哈希表比恒定时间查询要慢,因此V8在可能的情况下使用后者,但如果对象变得太复杂而无法使用隐藏类很好地处理,则回落到前者。

线性扫描显然也很糟糕,但是在我看来,V8试图通过一种称为内联缓存的技术来优化代码以缓解数据结构中的此问题:当您的代码尝试重复访问obj.prop时,V8最终决定只是动态地修补生成的代码,以使属性访问成为在给定偏移量下的恒定时间查找。
当然,如果预期的类类型错​​误,则必须回退并尝试缓慢查找。
this page上的function CompileNamedLoadFastProperty(klass, key)试图解释:

function CompileNamedLoadFastProperty(klass, key) {
  // Key is known to be constant (named load). Specialize index.
  var index = klass.getIndex(key);

  function KeyedLoadFastProperty(t, k, ic) {
    if (t.klass !== klass) {
      // Expected klass does not match. Can't use cached index.
      // Fall through to the runtime system.
      return NAMED_LOAD_MISS(t, k, ic);
    }
    return t.properties[index];  // Veni. Vidi. Vici.
  }

  return KeyedLoadFastProperty;
}

function NAMED_LOAD_MISS(t, k, ic) {
  var v = LOAD(t, k);
  if (t.klass.kind === "fast") {
    // Create a load stub that is specialized for a fixed class and key k and
    // loads property from a fixed offset.
    var stub = CompileNamedLoadFastProperty(t.klass, k);
    PatchIC("LOAD", ic, stub);
  }
  return v;
}

关于c++ - V8引擎中的隐藏类如何实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40323217/

10-11 22:28
查看更多