array.includes和string.includes哪个性能更好?

24

我正在尝试找出哪个更高效:

let array = [1,2,3,4]
array.includes(4)
或者
let str = "1234";
str.includes(4);

并已尝试通过执行以下操作来找出:

console.time();
let ar = [1,2,3,4,5];
ar.includes(4);
console.timeEnd();

console.time();
let str = "12345";
str.includes("4");
console.timeEnd();
在控制台和页面脚本中执行时,array.includes 的执行时间最短。但是在页面中执行时,string.includes 的执行时间较短。为什么?!

这是你在jsperf.com上的测试吗?我现在也注意到了同样的事情!在Chrome控制台上,String.includes速度很快,而在jsperf上则不是。 - Aftab Khan
是的,我刚刚在jsperf上创建了测试,链接为https://jsperf.com/array-includes-vs-string-includes。 - shashanka n
使用benchmarkJS库重建了相同的内容。在此处查看 https://jsfiddle.net/533hc71h/464/ - Aftab Khan
jsperf -- Chrome 58.0.3029 / Mac OS X 10.12.5 -- arr.includes(4) - 49,036,219 ±0.80% 最快 str.includes("4") - 15,905,764 ±0.85% 慢了68% - NiRUS
@shashankan 我认为你的情况中的差异在于时间计算中包含了声明部分。将其移出,你应该能看到一致的结果。请查看答案。 - Aftab Khan
显示剩余4条评论
3个回答

11

对于需要测试的少量值:

结论:array.includesstring.includes更快。

然后我尝试增加到约100个值:

结果相同:array.includesstring.includes更快。


如果您对实现算法感兴趣,可以在此处查看:


提示:在您的情况下,数组包含测试中变量声明所花费的时间比字符串声明更多。如果将声明移出计时器,则应该看到一致的结果。

证明:Proof

声明字符串所需的时间是声明数组所需时间的十分之一。


2
Array.prototype.includes 接受一个值,循环遍历数组并尝试将循环的值与搜索值进行匹配,而另一方面 String.prototype.includes 不仅需要循环遍历字符串(字符串=字符数组),还需要比较多个值。假设你在字符串 abcFoo 上使用 string.includes("Foo");,它会搜索 F,然后尝试将 F 后面的下一个索引与 o 进行比较,然后再将其后面的另一个索引与您指定的其他字符进行比较。它可能是这样工作的,但这只是我的个人想法 - 没有证明。 - Dawid Zbiński
我删除了答案中的那部分意见,因为我认为意见不构成对问题的回答。剩下的答案应该足以回答提问者的问题。 - Aftab Khan

3
根据不同浏览器平台的基准测试,一切取决于该平台上的Javascript引擎和运行时元素 (Windows, Mac或Ubuntu)
在Mac OS上,Chrome比Safari更快地使用Array.includes而较慢地使用String.includes。(jsperf.com测试用例由@shashanka n创建)
在Mac OS上,Node v8.0.0中的string.includes似乎比Array.includes更快,结果如下。 enter image description here Node测试用例源代码:
let ar = [1,2,3,4,5];
console.time("Array");
ar.includes(4);
console.timeEnd("Array");

let str = "1,2,3,4,5";
console.time("String");
str.includes("4");
console.timeEnd("String");

在Chrome上的上述测试用例 enter image description here

有时测试用例的模糊性可能会导致不同的结果。没有明确的方法来确定API的性能,我们只能投入一些毫秒,并且在大规模运行时,需要考虑其是否真正影响性能。


嗨,我认为这并不相关,因为它只运行一次。也许你可以让它运行1000次以获得平均值,因为我注意到仅运行一次测试会有很大的变异性 :) - TOPKAT

1

我测试时使用字符串而不是数字,因为过程中数字/字符串转换是一个重要的元素。

array.includes vs string.includes comparison

数组仍然比其他方式更快...

这是我的两个测试用例

var ar = ['a','b','c', 'd', 'e'];
var str = "abcde";

jsFiddle测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接