我正在搞乱JavaScript的推送和弹出功能。
我有一个名为arr
的数组。
当我运行时:
for (var i = 0; i < 100; i++) {
for (var k = 0; k < 100000; k++) {
arr.push(Math.ceil(Math.random() * 100));
arr.pop();
}
}
我的时间为251.38515999977244毫秒(我使用的是performance.now()函数)。
但是当我运行自定义推送和弹出时:
Array.prototype.pushy = function(value) {
this[this.length] = value;
}
Array.prototype.poppy = function() {
this.splice(-1, 1);
}
for (var i = 0; i < 100; i++) {
for (var k = 0; k < 100000; k++) {
arr.pushy(Math.ceil(Math.random() * 100));
arr.poppy();
}
}
时间是1896.055750000014毫秒。
任何人都可以解释为什么这些之间存在如此巨大的差异?
对那些担心时差的人。我跑了这个测试100次并计算了平均时间。我这样做了5次,以确保没有任何外围时间。
答案 0 :(得分:4)
因为编写的内置函数是浏览器编写的任何语言(可能是C ++)并且是编译的。自定义函数是用Javascript编写的并且被解释。
通常解释语言比编译语言慢得多。人们通常不会用Javascript注意到这一点,因为在大多数情况下,你只在人类交互之间执行几行JS(这总是最慢的部分)。
像你在这里完成的那样紧紧地运行JS,突出了它的不同之处。
答案 1 :(得分:2)
原因是内置功能是专门设计和优化的,以执行特定功能。浏览器在使用内置函数时采用任何可能的快捷方式,在自定义函数中可能无法快速识别。例如,对于您的实现,函数需要在每次调用函数时获取数组长度。
Array.prototype.pushy = function(value) {
this[this.length] = value;
}
但是,通过简单地使用Array.prototype.push
,浏览器就知道目的是在数组上附加值。虽然浏览器可能以不同的方式实现该功能,但我非常怀疑是否需要为每次迭代计算数组的长度。