为什么自定义函数比内置函数慢?

时间:2015-07-17 16:30:46

标签: javascript

我正在搞乱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次,以确保没有任何外围时间。

2 个答案:

答案 0 :(得分:4)

因为编写的内置函数是浏览器编写的任何语言(可能是C ++)并且是编译的。自定义函数是用Javascript编写的并且被解释。

通常解释语言比编译语言慢得多。人们通常不会用Javascript注意到这一点,因为在大多数情况下,你只在人类交互之间执行几行JS(这总是最慢的部分)。

像你在这里完成的那样紧紧地运行JS,突出了它的不同之处。

答案 1 :(得分:2)

原因是内置功能是专门设计和优化的,以执行特定功能。浏览器在使用内置函数时采用任何可能的快捷方式,在自定义函数中可能无法快速识别。例如,对于您的实现,函数需要在每次调用函数时获取数组长度。

Array.prototype.pushy = function(value) {
  this[this.length] = value;
}

但是,通过简单地使用Array.prototype.push,浏览器就知道目的是在数组上附加值。虽然浏览器可能以不同的方式实现该功能,但我非常怀疑是否需要为每次迭代计算数组的长度。