【问题标题】:V8 won't optimize more than 4 object types?V8 不会优化超过 4 种对象类型?
【发布时间】:2017-06-25 03:13:25
【问题描述】:

所以我在看 Franziska Hinkelmann 的 talk on the V8 engine

她在 20:03 发现,如果对象类型超过四种,V8 引擎将不会优化。我刚开始使用 node.js,所以我在这些事情上没有任何经验,但是四个似乎是一个非常低的数字。 OO软件通常不会涉及四种以上的对象类型吗?

我知道 V8 对对象可以具有的用于快速处理的属性数量有限制(8 个,似乎也很少)。

【问题讨论】:

  • 我可能会插话说,如果你刚开始使用 nodejs,你可能有 1000 多关于 node.js 和 Javascript 的重要知识要学习,一般来说,比 V8 优化。
  • 同意,但我是一个有计划的人。如果 V8 与普通的 OOP 不兼容,那是需要考虑的。
  • 呃,V8完美兼容普通OOP。有数百万行代码在执行广泛的 OOP,而 V8 可能是最好的性能引擎。 99.9999% 的代码根本不关心您关心的优化级别。学习一些破坏优化的编程“不要做”会很有用,但如果你只是在严格模式下编程,你会很好地做到这一点。并且在 OOP 中编程,nodejs 将执行得很好。
  • 另外,仅仅因为 V8 具有某些优化以在某些情况下使事情变得非常快并不意味着您不能编写无法使用所有这些优化的代码。这就是优化编译器所做的。他们寻找他们知道可以优化的东西(适合他们设计的某些模式)并大大加快速度。 99.9999% 的情况下,我们不需要担心这一点,当然在第一次学习语言时也不需要。还有很多其他因素会影响您最终结果的质量,远远超过您现在询问的水平。
  • 我建议您阅读以下内容:Optimization killers 并避免在您的所有编码中使用这些内容(也许在没有其他方法并且您接受后果时偶尔会出现有意识的例外)。但是,我不会花时间担心一个对象有多少属性。

标签: javascript node.js oop v8


【解决方案1】:

V8 开发人员在这里。在您所引用的谈话中,Franziska 所指的情况是,当您的代码中的一个位置(例如单个 do_something_with(obj.prop);)看到超过四种类型(对于 obj)时,它会切换到不同的模式。这与“不优化”不同——相反,当 V8 检测到这种模式时,它会针对它进行优化;碰巧的是,针对高度多态的代码进行优化需要与针对单态代码进行优化不同的方法。

正如 jfriend00 已经评论的那样,您很可能不必担心这个内部细节。

此外,据记录,对象在快速访问/缓慢创建配置中可以具有的属性数量约为 1,000。 (这是另一种情况,没有“好”/“快”和“坏”/“慢”状态,而是“为一个优化”或“为另一个优化”。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2015-05-31
    • 2023-04-07
    相关资源
    最近更新 更多