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

usr*_*usr 13 javascript performance javascript-engine object.observe

所述Object.observe()的JavaScript API允许任何一段代码以接收改变通知任何JavaScript对象的所有属性的变化.

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

似乎任何符合要求的JavaScript引擎现在都因此API而导致性能永久严重损失.

Vya*_*rov 17

现代JavaScript引擎利用内联缓存和自适应重新编译技术来最小化动态调度对生成的代码的影响.

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

类似的推理适用于在优化代码中省略保护的系统部分,而是取决于依赖于"形状"假设的代码:一旦观察到对象,所有优化代码取决于未观察到这样的对象的假设将被去优化.因此,再次没有为未观察到的对象付出代价.

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

  • 我在这里要说明的是,如果你不使用`Object.observe`,你付出**绝对没有.当您使用它时,特定成本将取决于实现和应用程序本身. (5认同)