我正在观看道格拉斯·克罗克福德(Douglas Crockford)的JS视频,他提到了一种方式来推动"推动"将项目放入数组中,而不使用#S8
方法。它非常简单,是我从未想过要做的事情,但在进行速度测试后,我发现它比Array.push
慢,这对我来说没有多大意义。
Array.push
(与Array.push
完全相同,加上其他内容以及调用函数本身的成本)之类的内容如何更快一个简单的表达?
也许我的测试很糟糕,也许我在这里缺乏CS基础知识,但如果有人能解释这里的速度差异,我真的很感激。我只是想看看array[array.length] = val
是否是array[array.length] = val
的更快替代品,但显然不是。克
这就是Array.push
的实施方式:
Array.push
正如你所看到的,它显然有更多的逻辑,然后是一个简单的表达,但它更快。
看看:
function push(value) {
var len = this.length;
this[len] = value;
len++;
this.length = len;
return len;
}
运行上面的示例,我得到0.015000000001236913,或简称为0.015。
现在让我们看一下let arr = [],
p1 = performance.now();
for (let i = 1, len = 10; i <= len; i++) {
arr[arr.length] = i;
}
let p2 = performance.now();
console.log(p2 - p1);
:
Array.push
运行上面的示例,我得到0.010000000002037268,或简称为0.010。
let arr = [],
p1 = performance.now();
for (let i = 1, len = 10; i <= len; i++) {
arr.push(i);
}
let p2 = performance.now();
console.log(p2 - p1);
为0.010,Array.push
为0.015,使用相同的循环。
这怎么可能?这对我来说完全没有意义。我在这里缺少什么?