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

Joã*_*imo 16 javascript regex performance indexof performance-testing

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

它以5种方式检查:

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

令我惊讶的是,排名第五的是Chrome 21中最快的.这是我无法解释的.

在Firefox 14中,普通的indexOf是最快的,我能相信的.

Aar*_*lla 8

我也很惊讶,但Chrome使用v8,这是一个高度优化的JavaScript引擎,可以提供各种技巧.谷歌的人可能拥有最大的JavaScript来测试其实施的性能.所以我猜这是发生的事情:

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

所有其他方法需要调用函数和局部性可能是regexp版本的问题,因为它们构建了一个解析树.