iCo*_*nor 9 javascript performance v8 object javascript-objects
据我所知,当您删除对象上的条目时,使用Javascript,至少使用chrome,它会将对象置于"字典模式"或"慢速模式"
例:
var user = { name: 'connor', sex: 'male' };
// user is in "fast mode"
delete user.sex;
// user is in ("slow" or "dictionary") mode
Run Code Online (Sandbox Code Playgroud)
什么时候这可能是有益的,何时可能是有害的?
一个具体的案例是,我有一个对象,当应用程序启动时,对象是空的,但是当代码运行并且应用程序内存建立时,它可能会变得非常大,并且对象永远不会减小,直到应用程序关闭它不会存在.
这种模式还有任何语义吗?
T.J*_*der 15
据我所知,当您删除对象上的条目时,使用Javascript,至少使用chrome,它会将对象置于"字典模式"或"慢速模式"
那不是JavaScript的东西; 这是Chrome内部V8引擎的一个实现特性.V8用户列表中的这个帖子讨论了这个:
[ZenWolf] ...使用JavaScript"delete"关键字从对象效果中删除属性(原文如此) v8将如何优化对象?...
[Sven Panne] ...删除属性会导致进入"慢速模式",即使用字典作为对象的属性.因此,作为一般经验法则,使用"删除"会使事情变得更慢......
您可以在此JSPerf中看到此效果.请注意使用V8(Chrome,Opera 20)的浏览器如何delete比没有它的浏览器慢.Firefox的最新SpiderMonkey无论如何都非常快,IE10和11受到轻微影响.(有趣的是,用于10.5到12 [我认为是]的引擎Opera,Carakan,甚至delete比V8 更受影响.)
如果您正在编写要在Web浏览器中使用的代码,那么针对特定引擎进行优化往往会浪费时间,除非您在该引擎上遇到特定的,真实的性能问题.(如果你是,那么一旦你处理了这个,确保这些改变不会弄乱其他引擎!)
如果您正在为NodeJS,SilkJS等编写,那么当然优化V8很好(虽然过早优化的常规规则仍然适用),因为这些是专门为V8构建的.
这种模式还有任何语义吗?
否.Java的语义由规范定义,如果对象的行为与规范的语义相匹配,则不规定对象是如何实现的; 该规范基本上没有解决性能问题.V8通过动态生成动态类并将它们编译为机器代码来实现对象,但是当您从它们中删除属性时,它们会回退到"慢"(字典)模式.(如果添加属性,Sven Panne在上面的引文中说的更常见的操作,它会动态创建派生类,这不会减慢速度.)但是其他引擎可以自由地将它们实现为哈希映射,或者链接属性列表或其他任何内容.
删除会使事情变慢,是的,但如果V8试图将对象保持在快速模式,即使你一直在改变它的形状,它也会更慢.对象必须具有一组固定的属性,以便它们可以在固定偏移处静态加载(就像C++或Java对象的字段一样).如果随机删除和添加属性(IE更改对象的形状),则无法在固定偏移处进行此静态加载.
所以它基本上是一个非常灵敏的启发式:如果你甚至一次调用delete,V8假设你将来会改变对象的形状并放弃它 - 即使实际上你只打算调用一次删除之后形状不变.
好处是,每次更改形状时,执行哈希表查找比重新计算隐藏类(并基于旧的隐藏类重新编译所有函数)要快得多.
| 归档时间: |
|
| 查看次数: |
1385 次 |
| 最近记录: |