Heyho 在 Javascript 中对地图和对象进行了一些测试,发现 null 比将值设置为 undefined 或简单地删除属性要快得多(2.5 倍)
如果您想知道为什么我总是创建地图和/或 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 操作(未定义到未定义)
我知道这个测试与其纯粹的兴趣无关,我问:)。
(V8 开发人员在此。)
微基准具有误导性!不要在他们身上浪费时间。
将对象属性设置为null或undefined具有相同的速度。有保证。
考虑到您的测试可重复显示的显着差异,我感到好奇并进行了一些研究。事实证明,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我们通常建议根本不要使用该关键字。删除地图中的条目则是另一回事:这完全没问题,因为地图的构建就是为了有效地支持这一点。
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |