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

标签 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 次,以确保没有任何异常时间。

最佳答案

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

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

像您在此处所做的那样在紧密循环中运行 JS,突出了差异。

关于javascript - 为什么自定义函数比内置函数慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31480536/

相关文章:

javascript - 使用 CSS3 Transform Scale 和 jQuery 制作动画脉冲效果

javascript - 子窗口关闭时如何调用父窗口的JavaScript函数?

javascript - 获取 "Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist"但监听器存在

javascript - 将背景颜色保存/检索到数据库

javascript - 不能指定禁用并且不会输入类的名称

javascript - 需要字母和数字 - 正则表达式

javascript - 使用 momentjs 设置当前日期和时间的格式

javascript - 如何使用 grunt 将 md5 哈希添加到 js 和 css 文件?

javascript - jQuery:突出显示 div 框 onload

javascript - JSON : How to get data from a same "column" with different names?