首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Object.observe()是如何影响性能的?

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

Stack Overflow用户
提问于 2013-02-27 14:23:56
回答 2查看 4.8K关注 0票数 13

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

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

由于这个API,任何符合标准的JavaScript引擎现在都被锁定在性能的永久和严重的损失中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-27 16:51:50

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

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

类似的推理也适用于系统中忽略了优化代码的部分,而是依赖于“形状”假设的去优化代码:一旦一个对象被观察到,所有优化的代码都取决于这样的对象没有被观察到的假设将被去优化。因此,对于未观测的物体,再一次没有付出任何代价。

也就是说,当前Object.observe在V8中的实现使得被观察对象付出了高昂的代价,因为它将对象规范化(将它们转换为字典表示),并且需要通过运行时系统进行往返以记录观察。但是,在以后大幅度降低这一费用方面并没有固有的技术困难。

票数 17
EN

Stack Overflow用户

发布于 2013-02-27 15:11:28

这不严重影响JavaScript引擎(即V8)可以执行的代码生成和性能优化吗?

是。与代理、Getters/Setters甚至原型对象一样,它们在JavaScript中都是动态的。

但是,由于它们的异步性,新的(更好的)优化是可能的;它们可能会使其他效率更低的代码过时。引用 from the harmony draft

  • 不需要包装器或代理对象,提供内存效率和对象标识
  • 更改对象上属性的添加/删除通知
  • 更改对对象上属性的属性描述符的修改通知
  • 对象手动指示访问器属性何时更改的能力。
  • 在引擎中有效地实现
  • 简单,目标,扩展到当前ES
  • 更改的Asynchronous通知,但允许同步获取待交付的更改
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15114448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档