在此之前作为一个巨大的惊喜给我,我想知道这个结果。 我做了一个在jsperf测试是基本上应该采取的字符串(即,我想检查URL的一部分),并检查的4个项目(即实际上,存在于串中)的存在。
它检查在5种方法:
- 纯的indexOf;
- 分割字符串,然后的indexOf;
- 正则表达式搜索;
- 正则表达式匹配;
- 拆分字符串,遍历项目的数组,然后检查其中是否它应该匹配的东西相匹配
要我巨大的惊喜,5号是在Chrome 21中最快的 。 这是我无法解释。
在Firefox 14中,普通的indexOf是最快的,一个我可以相信。
我也惊讶,但Chrome使用的V8,一个高度优化的JavaScript引擎,从而牵引各种花样。 而在谷歌的人可能有最大的组JavaScript的运行,以测试其实现的性能。 所以我的想法是这样的情况发生:
- 编译器的通知,该阵列是一个字符串数组(类型可以在编译时,没有必要运行时检查来确定)。
- 在循环中,因为你用
===
,内置的CPU运算代码比较字符串( repe cmpsb
)都可以使用。 因此,没有函数被调用(不同于任何其他测试用例) - 第一循环之后,一切都重要(数组,字符串比较反对)是在CPU缓存。 局部性rulez他们。
所有其他方法需要调用功能,因为他们建立一个解析树地点可能是正则表达式版本的问题。
我已经增加了两个测试: http://jsperf.com/finding-components-of-a-url/2
单正则表达式现在是最快的(在Chrome)。 也正则表达式文字是比转换成正则表达式字符串文字更快。
文章来源: Javascript Performance: How come looping through an array and checking every value is faster than indexOf, search and match?