为什么将值置空比取消定义它更快 (javascript v8)

Scr*_*ype 1 javascript v8

Heyho 在 Javascript 中对地图和对象进行了一些测试,发现 null 比将值设置为 undefined 或简单地删除属性要快得多(2.5 倍)

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

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

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

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

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

jmr*_*mrk 5

(V8 开发人员在此。)

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

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

考虑到您的测试可重复显示的显着差异,我感到好奇并进行了一些研究。事实证明,measurethat.net 的框架代码……比方说……远非完美:它使用“direct eval”的方式引入了访问全局变量的巨大性能工件(这是“从不使用 direct 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我们通常建议根本不要使用该关键字。删除地图中的条目则是另一回事:这完全没问题,因为地图的构建就是为了有效地支持这一点。