javascript - 为什么将值归零比取消定义更快(javascript v8)
问题描述
Heyho 用 Javascript 中的 map 和 objects 进行了一些测试,发现 nulling 比将值设置为 undefined 或比较简单地删除属性要快得多(2,5 倍)
如果您想知道为什么我总是创建地图和/或 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(未定义到未定义)
我知道测试并不真正相关它的纯粹兴趣我问:)。
解决方案
(这里是 V8 开发人员。)
微基准具有误导性!不要在他们身上浪费时间。
将对象属性设置为null
或undefined
具有相同的速度。保证。
考虑到您的测试可重现地显示出的显着差异,我很好奇并挖了一点。事实证明 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 旨在有效地支持这一点。
推荐阅读
- php - 传单错误“未捕获的错误:函数名称必须是字符串”
- google-sheets - 搜索一张工作表的列并从 CSV 中的单独工作表返回多个匹配项
- android - 这个嵌套的android布局视图的最佳方法是什么
- android - 无法将底部工作表对话框定位在屏幕底部
- android - Android Firebase 推送并获取数组列表
- css - 如何仅为容器而不是内部元素制作阴影
- ios - 使用 Firebase 身份验证和实时数据库执行 segue 时出现问题
- java - 当使用带有可变参数参数的构造函数时,我如何强制必须至少传递一个参数?
- python - 在 python 中使用gingerit 时收到 Traceback 错误
- python - kivy 弹出问题。如何让弹出窗口显示在 kivy 模块上?