Javascript 性能 : How come looping through an array and checking every value is faster than indexOf, 搜索和匹配?

标签 javascript regex performance performance-testing indexof

这对我来说是一个巨大的惊喜,我想了解这个结果。我做了一个test in 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 缓存中。地方决定一切。

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

关于Javascript 性能 : How come looping through an array and checking every value is faster than indexOf, 搜索和匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11774366/

相关文章:

javascript - 我什么时候需要立即调用 JavaScript 匿名函数?

regex - IIS Url 重写 : Add Trailing Slash, 保留 anchor 和查询字符串

javascript - "Storage"函数会减慢 Firefox 中的表单提交速度

objective-c - 什么时候使用@property?

javascript - JS用什么技巧显示/计算 float

javascript - Mongoose 独特的结果

javascript - Canvas 动画 Javascript 反向

javascript - 如何在 split() javascript 中排除转义字符

javascript - javascript 中的正则表达式 - 正则表达式中的变量

java - 使用自定义比较器时使用 TreeSet 还是 ArrayList 更好