首页 > 解决方案 > 为什么将值归零比取消定义更快(javascript v8)

问题描述

Heyho 用 Ja​​vascript 中的 map 和 objects 进行了一些测试,发现 nulling 比将值设置为 undefined 或比较简单地删除属性要快得多(2,5 倍)

https://www.measurethat.net/Benchmarks/Show/15592/0/compare-nulling-undefining-and-deleting-of-javascript-o

如果您想知道为什么我总是创建地图和/或 javascript 对象,我这样做是为了让每个测试都有相同的“开销”。

编辑:也得到了这个,其中有一个逻辑错误(将值从 null 设置为 null 或将其从 undefined 设置为 undefined) https://www.measurethat.net/Benchmarks/Show/15587/0/delete- vs-null-vs-undefined-vs-void-0-vs-objectcreatenu

这里的结果是更极端的 4mio ops(从 null 到 null)与 4k ops(未定义到未定义)

我知道测试并不真正相关它的纯粹兴趣我问:)。

标签: javascriptv8

解决方案


(这里是 V8 开发人员。)

微基准具有误导性!不要在他们身上浪费时间。

将对象属性设置为nullundefined具有相同的速度。保证。

考虑到您的测试可重现地显示出的显着差异,我很好奇并挖了一点。事实证明 measurethat.net 的框架代码......比方说......远非完美:它使用“直接”的方式为访问全局变量引入了巨大的性能工件(这是“从不使用直接!”eval的几个原因之一)eval常见的建议),而 JavaScript 的历史意外之一是 whilenull是一个保留关键字,undefined它只是一个全局变量。看看这里有多荒谬:
https
://www.measurethat.net/Benchmarks/Show/15627/0/accessing-null-vs-undefined 如果你知道发生了什么,你可以回避这个问题:
https:// www.measurethat.net/Benchmarks/Show/15635/0/null-vs-undefined-iiffe
但请记住,在不使用 的真实应用程序中eval,您不会看到任何这些差异;你只是在和一个糟糕的基准跑者玩游戏!

该站点上真正奇怪的另一件事是,在编辑测试用例并“验证”它们时,与提交后“运行”它们相比,它们会产生非常不同的结果(我见过 100 倍!)。

简而言之,我不会相信该网站上报告的任何数字。

综上所述,慢一点是有道理delete a.a的,因为删除对象属性比覆盖现有属性的值更复杂。重要的是(并且您的基准测试没有显示这一点,因为它太简单了!),删除属性通常会产生非本地影响,即不一定是删除本身很慢,但您的应用程序的其他部分可能会因为副作用而变慢. 我们通常建议根本不要使用delete关键字。删除 Maps 中的条目是另一回事:这很好,因为 Maps 旨在有效地支持这一点。


推荐阅读