javascript - Object.observe() 如何影响性能?

标签 javascript performance javascript-engine object.observe

Object.observe() JavaScript API 允许任何代码段接收任何 JavaScript 对象的所有属性更改的更改通知。

这不会严重影响 JavaScript 引擎(即 V8)可以执行的代码生成和性能优化吗?生成的 native 代码现在似乎必须检查每次写入如果必须生成更改通知,则发送给对象。无法静态确定给定对象是否设置了通知。因此无法优化检查。

由于此 API,任何符合标准的 JavaScript 引擎现在似乎都陷入了永久和严重的性能损失。

最佳答案

现代 JavaScript 引擎利用内联缓存和自适应重新编译技术来最大限度地减少动态调度对生成代码的影响。

如果我们谈论的是 V8,那么对象是否被观察到的事实被编码在它的隐藏类中。内联缓存 stub 和优化代码都已经根据某些预期值检查隐藏类以确定对象是否具有预期形状。同样的检查提供了关于对象是否被观察到的信息。因此,与非观察对象一起使用的代码路径没有任何变化。开始观察对象的处理方式与改变对象的形状相同:对象的隐藏类被切换为不同的类,并设置了观察位:您可以阅读 Runtime_SetIsObserved看到这个。

类似的推理适用于在优化代码中省略守卫的系统部分,而是根据“形状”假设取消优化代码:一旦一个对象被观察到,所有优化代码取决于该对象未被观察到的假设取消优化。因此,没有为未观察到的对象支付任何价格。

也就是说,当前 V8 中 Object.observe 的实现让观察到的对象付出了高昂的代价,因为它对其进行了规范化(将它们变成字典表示)并且需要通过运行时系统进行往返以进行观察记录。但在以后显着降低此成本方面并没有固有的技术困难。

关于javascript - Object.observe() 如何影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114448/

相关文章:

javascript - ImmutableJS 会跳过未使用的代码块吗?

performance - 为什么 Haskell 的 'even' 函数会减慢我的程序速度?

javascript - 使用 'with' 关键字在 Javascript 中进行范围解析

javascript - 为什么函数表达式不包含在执行上下文的变量对象中?

javascript - setInterval 只工作一次,然后停止

javascript - 以编程方式绘制一组正方形的边界的最佳方法是什么?

javascript - 解析 JSON 的问题——作为 application/x-www-form-urlencoded 发送的 ajax 请求

performance - React 16 性能中的无状态函数与类

performance - 在Where条件中使用变量时,Hive查询运行非常缓慢

javascript - 当 DOM 元素消失时,绑定(bind)事件会发生什么?