Javascript性能:如何在数组中循环并检查每个值比indexOf、search和match更快
Javascript Performance: How come looping through an array and checking every value is faster than indexOf, search and match?
这对我来说是一个巨大的惊喜,我想了解这个结果。我在jsperf中做了一个测试,基本上应该接受一个字符串(这是我想检查的URL的一部分),并检查是否存在4个项目(事实上,这些项目存在于字符串中)。
它通过5种方式进行检查:
- 普通索引
- 拆分字符串,然后indexOf
- 正则表达式搜索
- 正则表达式匹配
- 拆分字符串,在项目数组中循环,然后检查其中是否有与应该匹配的内容匹配的内容
令我惊讶的是,数字5是Chrome 21中速度最快的。这是我无法解释的。
在Firefox 14中,普通indexOf是最快的,我可以相信。
我也很惊讶,但Chrome使用v8,这是一个高度优化的JavaScript引擎,可以使用各种技巧。谷歌的员工可能拥有最大的一组JavaScript来测试其实现的性能。所以我的猜测是这样的:
- 编译器注意到数组是一个字符串数组(类型可以在编译时确定,不需要运行时检查)
- 在循环中,由于使用
===
,因此可以使用内置的CPU操作代码来比较字符串(repe cmpsb
)。因此没有调用任何函数(与任何其他测试用例不同) - 在第一个循环之后,所有重要的东西(数组、要比较的字符串)都在CPU缓存中。地方统治着他们所有人
调用函数所需的所有其他方法,对于regexp版本来说,位置可能是一个问题,因为它们构建了一个解析树。
我又添加了两个测试:http://jsperf.com/finding-components-of-a-url/2
单个regExp现在是最快的(在Chrome上)。此外,regExp文本比转换为regExp的字符串文本更快。
相关文章:
- Lucene Search in Alfresco
- 为什么indexOf在这个js代码中不起作用
- Angularjs通过过滤器获取indexOf
- indexOf具有2个参数
- .indexOf()不适用于特定元音
- 对字符串使用IndexOf来挑选某些单词
- JSON and jQuery Search
- 如果window.location.href.indexOf('player=1')添加样式
- inArray,indexOf在二维数组中
- Javascript Regex Search
- 为什么我得到“;没有方法'indexOf'"在ExtJS4.2中尝试在网格上使用缓冲渲染器时出错
- Search a Sencha TreePicker
- 需要一些str.indexOf帮助javascript
- 要筛选的数组的管道值的含义:$select.search in angular
- Safari Array indexOf找不到任何内容
- TypeError:无法读取属性'indexOf'的未定义
- 过度杀戮?使用indexOf()来发现字符串的内容
- JavaScript indexOf 与数百万个匹配项
- Javascript性能:如何在数组中循环并检查每个值比indexOf、search和match更快
- 如何搜索在iOS自动化脚本字符串中的子字符串?indexOf()和search()方法不工作