为什么在没有主人的情况下调用函数会变慢?

wm1*_*1sr 8 javascript optimization jsperf

如果我执行以下操作:

var abs = Math.abs;

abs(-10)应该快Math.abs(-10)?因为abs是直接调用的.

这就是我的注意力: Math.abs vs自定义abs功能 在jsperf.com上完成测试的结果

更新:

在Internet Explorer 11中执行的相同测试显示了完全不同的结果: 在jsperf.com上完成测试的结果

我推测这是由于对Chrome V8引擎内置功能的一些优化.

nnnnnn创建的测试,阐明了我想说的内容:属性快捷方式 在jsperf.com上完成测试的结果

Teo*_*ndu 3

Givi 认为这个答案毫无用处。看评论。

在用户定义的对象中查找用户定义的函数比查找绑定到局部变量的函数慢,所以您基本上是对的。

然而,查找Math.*函数速度更快,很可能是因为 V8 引擎的内部优化(因此在局部变量中“缓存”内置函数实际上更慢,而“缓存”用户定义函数更快)。

编辑:这里有一个 jsperf演示了Math.*函数如何比其对应函数更快var x = Math.x,而对用户定义的函数执行相同的操作则不然。恕我直言,这就是 V8 的工作原理。 检测结果

编辑#2:刚才我从你的问题中注意到这一行:

我推测这是由于 Chrome V8 引擎中内置函数的一些优化所致。

我不是 100% 确定,但看起来确实是这样,是的。

  • 打开你的 javascript 控制台并输入此脚本... ### `(function() { for (var i = 100000000, start = new Date().getTime(); i > 0; i--) { Math.abs (-111); } var end = new Date().getTime(); var result = end - start; console.log(result); }());` ### 用于检查 `Math.abs` 和这个一个 for `var abs = Math.abs;` ### `(function() { var abs = Math.abs; for (var i = 100000000, start = new Date().getTime(); i > 0; i --) { abs(-111); } var end = new Date().getTime(); var result = end - start; console.log(result); }());`### (2认同)
  • `数学.abs` -> 23609 ; `var abs = Math.abs` -> 1125 。这就是问题所在...所以我猜 jsperf 不值得信任。谢谢吉维。 (2认同)
  • 如果你复制源代码并直接粘贴到 javascript 控制台,看看 [jsFiddle](http://jsfiddle.net/GKDev/jhHX7/) 会更好。 (2认同)