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 中正确格式化它们的输出

遍历性能

JS -javascript 数组遍历的几种方式,数组或对象循环遍历的对比分析,性能使用合理使用

js数组对象的遍历