为什么清空一个值比取消定义它更快 (javascript v8)
Why is nulling a value faster than undefining it (javascript v8)
Heyho 对 Javascript 中的地图与对象进行了一些测试,发现归零比将值设置为未定义或与简单地删除 [=27= 相比要快得多(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(undefined 到 undefined)相比更极端
我知道这个测试与我问的纯粹兴趣无关:)。
Javascript 对象还必须说明哪些键是“可枚举的”。删除键会将其从可枚举的键列表中移除。这类似于从数组中删除一个元素,这种操作比简单地用 null
.
覆盖一个值要慢
我不确定为什么将值设置为 undefined
会比较慢。我认为这是因为类似的原因,因为缺少的键的值为 undefined
.
(此处为 V8 开发人员。)
微基准测试具有误导性!不要在它们上面浪费时间。
设置对象 属性 到 null
或 undefined
具有相同的速度。保证。
考虑到您的测试可重复显示的显着差异,我很好奇并进行了深入研究。原来 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 的性能和技术方面非常有趣,并且一般情况下的性能不应该被完全忽略,但这是不明显的,在现实生活中你不应该关心它。
注:
这是我的个人理解,不应作为官方信息。欢迎在评论中指正。
Heyho 对 Javascript 中的地图与对象进行了一些测试,发现归零比将值设置为未定义或与简单地删除 [=27= 相比要快得多(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(undefined 到 undefined)相比更极端
我知道这个测试与我问的纯粹兴趣无关:)。
Javascript 对象还必须说明哪些键是“可枚举的”。删除键会将其从可枚举的键列表中移除。这类似于从数组中删除一个元素,这种操作比简单地用 null
.
我不确定为什么将值设置为 undefined
会比较慢。我认为这是因为类似的原因,因为缺少的键的值为 undefined
.
(此处为 V8 开发人员。)
微基准测试具有误导性!不要在它们上面浪费时间。
设置对象 属性 到 null
或 undefined
具有相同的速度。保证。
考虑到您的测试可重复显示的显着差异,我很好奇并进行了深入研究。原来 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 的性能和技术方面非常有趣,并且一般情况下的性能不应该被完全忽略,但这是不明显的,在现实生活中你不应该关心它。
注:
这是我的个人理解,不应作为官方信息。欢迎在评论中指正。