Javascript 性能:为啥遍历数组并检查每个值比 indexOf、搜索和匹配更快?
Posted
技术标签:
【中文标题】Javascript 性能:为啥遍历数组并检查每个值比 indexOf、搜索和匹配更快?【英文标题】:Javascript Performance: How come looping through an array and checking every value is faster than indexOf, search and match?Javascript 性能:为什么遍历数组并检查每个值比 indexOf、搜索和匹配更快? 【发布时间】:2012-07-31 05:47:54 【问题描述】:这对我来说是一个巨大的惊喜,我想了解这个结果。我做了一个test in jsperf,它基本上应该接受一个字符串(这是我想检查的 URL 的一部分)并检查是否存在 4 个项目(实际上,这些项目存在于字符串中)。
它以 5 种方式检查:
-
普通 indexOf;
拆分字符串,然后indexOf;
正则表达式搜索;
正则表达式匹配;
拆分字符串,循环遍历数组,然后检查其中是否有任何匹配它应该匹配的东西
令我大吃一惊的是,5 号是 Chrome 21 中最快的。这是我无法解释的。
在 Firefox 14 中,普通 indexOf 是最快的,我可以相信。
【问题讨论】:
实际上对我来说很有意义......您只对字符串进行了一次迭代而不是四次。虽然indexOf
当然更早爆发,但我可以想象字符串太短而不会产生影响(但这并不能解释 Firefox 的结果:-/)。
好问题。 +1,特别是用于制作测试用例。
@FelixKling 遍历字符串一次而不是 4 次是什么意思?它确实通过字符串 4 次来评估 4 个项目中的每一个......
实际上我后来意识到我的意思是迭代数组......我在考虑你的测试用例 4 和 5(4 是你迭代数组的地方,5 是你使用 indexOf
的地方) . indexOf
总是必须遍历数组,直到找到匹配项并且您这样做四次,因此您可能必须遍历整个数组四次,而 while
循环只需一次。与第一个测试用例类似(对字符串进行四次迭代)。
@FelixKling 哦,我现在明白了 :)
【参考方案1】:
我也很惊讶,但 Chrome 使用了 v8,这是一个高度优化的 javascript 引擎,它可以使用各种技巧。谷歌的人可能拥有最大的 JavaScript 集来测试他们的实现性能。所以我的猜测是会发生这种情况:
-
编译器注意到该数组是一个字符串数组(类型可以在编译时确定,无需运行时检查)。
在循环中,由于您使用
===
,因此可以使用内置的CPU操作码来比较字符串(repe cmpsb
)。因此没有调用任何函数(与任何其他测试用例不同)
在第一个循环之后,所有重要的东西(数组、要比较的字符串)都在 CPU 缓存中。地方统治他们所有。
所有其他方法都需要调用函数,并且局部性可能是正则表达式版本的一个问题,因为它们构建了一个解析树。
【讨论】:
【参考方案2】:我又添加了两个测试:http://jsperf.com/finding-components-of-a-url/2
现在单个 regExp 最快(在 Chrome 上)。 regExp 文字也比转换为 RegExp 的字符串文字快。
【讨论】:
关于正则表达式文字的有趣事实,但组合的正则表达式不能作为替代品,因为我想最终得到 4 个变量,这些变量评估为真或假(或 0 或 1)天气字符串是找到与否。以上是关于Javascript 性能:为啥遍历数组并检查每个值比 indexOf、搜索和匹配更快?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 javascript 中的 Promise 遍历问题数组中的每个项目
无法遍历我的数组/对象。 Javascript,React Native [重复]
尝试遍历两个数组并在 JavaScript 中正确格式化它们的输出