为什么清空一个值比取消定义它更快 (javascript v8)

Why is nulling a value faster than undefining it (javascript v8)

Heyho 对 Javascript 中的地图与对象进行了一些测试,发现归零比将值设置为未定义或与简单地删除 [=27= 相比要快得多(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(undefined 到 undefined)相比更极端

我知道这个测试与我问的纯粹兴趣无关:)。

Javascript 对象还必须说明哪些键是“可枚举的”。删除键会将其从可枚举的键列表中移除。这类似于从数组中删除一个元素,这种操作比简单地用 null.

覆盖一个值要慢

我不确定为什么将值设置为 undefined 会比较慢。我认为这是因为类似的原因,因为缺少的键的值为 undefined.

(此处为 V8 开发人员。)

微基准测试具有误导性!不要在它们上面浪费时间。

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

考虑到您的测试可重复显示的显着差异,我很好奇并进行了深入研究。原来 measurethat.net 的框架代码是......让我们说......远非完美:它使用“直接 eval” 的方式引入了访问全局变量的巨大性能工件(这是几个“永远不要使用直接 eval!” 是常见建议的原因),JavaScript 的历史事故之一是 null 是保留关键字,而 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 关键字。在地图中删除条目是另一回事:这完全没问题,因为地图的构建是为了有效地支持它。

我会说这是因为 delete 实际上必须删除,而 null 只会清空其内容。

比较

  • 删除删除 属性,使其变慢但释放一些内存。
  • 无效化更快但是 属性,当 null 时,属性 仍然存在。

具有 3000 个 属性 为 null 的对象在 ram 中比空对象占用更多 space。

总结

虽然 JavaScript 的性能和技术方面非常有趣,并且一般情况下的性能不应该被完全忽略,但这是不明显的,在现实生活中你不应该关心它。

注:

这是我的个人理解,不应作为官方信息。欢迎在评论中指正。