Javascript性能:如何在数组中循环并检查每个值比indexOf、search和match更快

Javascript Performance: How come looping through an array and checking every value is faster than indexOf, search and match?

本文关键字:indexOf search 更快 match 检查 性能 数组 循环 Javascript      更新时间:2023-09-26

这对我来说是一个巨大的惊喜,我想了解这个结果。我在jsperf中做了一个测试,基本上应该接受一个字符串(这是我想检查的URL的一部分),并检查是否存在4个项目(事实上,这些项目存在于字符串中)。

它通过5种方式进行检查:

  1. 普通索引
  2. 拆分字符串,然后indexOf
  3. 正则表达式搜索
  4. 正则表达式匹配
  5. 拆分字符串,在项目数组中循环,然后检查其中是否有与应该匹配的内容匹配的内容

令我惊讶的是,数字5是Chrome 21中速度最快的。这是我无法解释的。

在Firefox 14中,普通indexOf是最快的,我可以相信。

我也很惊讶,但Chrome使用v8,这是一个高度优化的JavaScript引擎,可以使用各种技巧。谷歌的员工可能拥有最大的一组JavaScript来测试其实现的性能。所以我的猜测是这样的:

  1. 编译器注意到数组是一个字符串数组(类型可以在编译时确定,不需要运行时检查)
  2. 在循环中,由于使用===,因此可以使用内置的CPU操作代码来比较字符串(repe cmpsb)。因此没有调用任何函数(与任何其他测试用例不同)
  3. 在第一个循环之后,所有重要的东西(数组、要比较的字符串)都在CPU缓存中。地方统治着他们所有人

调用函数所需的所有其他方法,对于regexp版本来说,位置可能是一个问题,因为它们构建了一个解析树。

我又添加了两个测试:http://jsperf.com/finding-components-of-a-url/2

单个regExp现在是最快的(在Chrome上)。此外,regExp文本比转换为regExp的字符串文本更快。