18

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

它以 5 种方式检查:

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

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

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

4

2 回答 2

9

我也很惊讶,但 Chrome 使用了 v8,这是一个高度优化的 JavaScript 引擎,它可以使用各种技巧。谷歌的人可能拥有最大的 JavaScript 集来测试他们的实现性能。所以我的猜测是会发生这种情况:

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

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

于 2012-08-02T10:30:50.120 回答
3

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

单个 regExp 现在最快(在 Chrome 上)。regExp 文字也比转换为 RegExp 的字符串文字快。

于 2012-08-02T09:59:40.697 回答