【问题标题】:Which is more performant array.includes or string.includes?哪个更高效 array.includes 或 string.includes?
【发布时间】:2017-11-30 00:51:27
【问题描述】:

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

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 上的测试吗?甚至我现在也注意到了同样的事情! String.includes 在 chrome 的控制台上比在 jsperf 上快
  • 是的,我刚刚在 jsperf.com/array-includes-vs-string-includes 的 jsperf 上创建了测试
  • 使用 benchmarkJS 库重新创建了相同的内容。在这里查看jsfiddle.net/533hc71h/464
  • 注意只有四个元素不是一个很好的测试基准。因为与string.includes 相比,array.includes 可能具有轻微的初始恒定开销以及其他外部因素。将其增加到每 50 多个元素,您将在这两种情况下获得预期的结果。
  • Chrome 58.0.3029 / Windows 10 0.0.0 -- jsPerf -- Array.includes 更快。 String.includes 的输出速度慢了 81%。

标签: javascript arrays string performance


【解决方案1】:

使用少量值进行测试

结论:array.includesstring.includes

然后我尝试将值的数量增加到〜100

得到相同的结果:array.includesstring.includes


如果你对实现算法感兴趣可以看这里:


PS:在您的情况下,我认为变量声明在 Array Incldus 测试中比字符串声明花费更多时间。如果您将声明移出计时器,您还应该看到一致的结果。

证明:

字符串声明时间是声明数组时间的 1/10

【讨论】:

  • Array.prototype.includes 获取值,遍历数组并尝试将循环值与搜索值匹配,而另一方面 String.prototype.includes 不仅需要遍历字符串(字符串 = 数组字符),但它需要比较多个值。假设您在字符串abcFoo 上选择string.includes("Foo");。它搜索F,然后尝试将F 之后的下一个索引与o 进行比较,然后再将另一个索引与您指定的其他字符进行比较。它可能会这样工作,但这只是我个人的想法 - 没有得到证实。
  • 我删除了有意见的那部分答案,我不认为意见构成问题的答案。其余的答案应该足以满足 OP 的问题
【解决方案2】:

基于不同浏览器平台上的基准测试,这完全取决于该平台上的 Javascript 引擎和运行时元素(Windows、Mac 或 Ubuntu)

Mac OS 上的 Chrome 产生的 Array.includesString.includes 快,而在 Safari Mac OS 上却相反。(jsperf.com 测试用例由 @shashanka n 创建)

Mac OS 上的 Node v8.0.0 string.includes 似乎比 Array.includes 快,结果如下

节点测试用例源码:

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 上的上述测试用例

有时测试用例的歧义可能会导致不同的结果。没有确定的方法来确定 API 的性能,我们可以只留出几毫秒的时间并忍受它,直到它真正重要或阻碍更大规模的性能。

【讨论】:

  • 嗨,我认为这无关紧要,因为它只运行一次。也许你可以让它运行 1000 次以获得平均值,因为我注意到运行测试一次而不是很多次的变化很大:)
【解决方案3】:

我使用字符串而不是数字进行测试,因为其中一个重要元素是数字/字符串转换

数组仍然快得多...

这是我的 2 个测试用例

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

jsFiddle test

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多