为什么通过索引访问数组的元素比使用.find()函数慢?

时间:2017-08-01 10:50:54

标签: javascript arrays

对于下面的特定情况,似乎使用.find函数明显快于使用元素的索引。这是为什么?

jsPerf Results

2 个答案:

答案 0 :(得分:2)

您可以使用随机数来查找对象。

指数:

var i = Math.floor(Math.random() * 10),
    o = array[i];

vs Find:

var i = Math.floor(Math.random() * 10),
    o = array.find(o => o.id === i);

使用共享数据

var array = [{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }, { id: 8 }, { id: 9 }];

然后你来自jsperf(与EDGE):

Index: 31,707,818 ±0.    92% fastest
Find:   5,001,388 ±1.51% 84% slower

<强>结论

使用Array#find时,索引访问速度更快。

答案 1 :(得分:1)

两个样本都不到0毫秒

&#13;
&#13;
var now = new Date();
var items = [{id: 0}, {id: 1}, {id: 2}, {id: 3}];
var item = items[2];
document.write((new Date().getTime() - now.getTime()) + 'ms');
&#13;
&#13;
&#13;

&#13;
&#13;
var now = new Date();
var items = [{id: 0}, {id: 1}, {id: 2}, {id: 3}];
var item = items.find(e => e.id === 2);
document.write((new Date().getTime() - now.getTime()) + 'ms');
&#13;
&#13;
&#13;

但是对于100K阵列大小,图片是不同的

&#13;
&#13;
var items = [];

for(var id = 0; id < 100000; id++) {
  items.push({id: id});
}

var now = new Date();
var item = items[99999];
document.write((new Date().getTime() - now.getTime()) + 'ms');
&#13;
&#13;
&#13;

&#13;
&#13;
var items = [];

for(var id = 0; id < 100000; id++) {
  items.push({id: id});
}

var now = new Date();
var item = items.find(e => e.id === 99999);
document.write((new Date().getTime() - now.getTime()) + 'ms');
&#13;
&#13;
&#13;

正如您所看到的,索引的直接访问速度要快得多,因为find方法应该在找到正确的项之前检查很多项。即主题启动器假设(通过索引直接访问比find方法慢)显然是不正确的