Javascript性能:如何循环访问数组并检查每个值比indexOf,搜索和匹配更快?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

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

它检查5种方式:

  1. 普通indexOf;
  2. 拆分字符串,然后indexOf;
  3. 正则表达式搜索;
  4. 正则表达式匹配;
  5. 拆分字符串,遍历项目数组,然后检查它们中的任何一个是否匹配它应该匹配的东西

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

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

提问于
用户回答回答于

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

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

所有其他方法都需要调用函数,而局部性可能是正则表达式版本的问题,因为它们构建了一个分析树。

用户回答回答于

扫码关注云+社区