Object.observe() JavaScript API允许任何代码段接收任何JavaScript对象的所有属性更改的更改通知。
不严重影响JavaScript引擎(即V8)可以执行的代码生成和性能优化吗?看起来,如果必须生成更改通知,生成的本机代码现在必须检查对对象的每一次写入。无法静态地确定给定对象是否设置了通知。因此,无法优化检查。
由于这个API,任何符合标准的JavaScript引擎现在都被锁定在性能的永久和严重的损失中。
发布于 2013-02-27 16:51:50
现代JavaScript引擎利用内联缓存和自适应重新编译技术来最小化动态调度对生成代码的影响。
如果我们讨论的是V8,那么是否观察到对象的事实是在它的隐藏类中编码的。内联缓存存根和优化代码都已经根据某些期望值检查隐藏类,以确定对象是否具有预期形状。同样的检查提供了关于是否观察到该对象的信息。因此,与未观察对象一起工作的代码路径不会发生任何变化。开始观察对象的方式与改变它的形状相同:对象的隐藏类被切换到另一个对象,并设置了一个观察位:您可以阅读Runtime_SetIsObserved
来查看这个信息。
类似的推理也适用于系统中忽略了优化代码的部分,而是依赖于“形状”假设的去优化代码:一旦一个对象被观察到,所有优化的代码都取决于这样的对象没有被观察到的假设将被去优化。因此,对于未观测的物体,再一次没有付出任何代价。
也就是说,当前Object.observe
在V8中的实现使得被观察对象付出了高昂的代价,因为它将对象规范化(将它们转换为字典表示),并且需要通过运行时系统进行往返以记录观察。但是,在以后大幅度降低这一费用方面并没有固有的技术困难。
发布于 2013-02-27 15:11:28
这不严重影响JavaScript引擎(即V8)可以执行的代码生成和性能优化吗?
是。与代理、Getters/Setters甚至原型对象一样,它们在JavaScript中都是动态的。
但是,由于它们的异步性,新的(更好的)优化是可能的;它们可能会使其他效率更低的代码过时。引用 from the harmony draft
https://stackoverflow.com/questions/15114448
复制相似问题