【问题标题】:Why does calling a function without its owner is slower?为什么在没有所有者的情况下调用函数会更慢?
【发布时间】:2013-11-30 14:39:22
【问题描述】:

如果我执行以下操作:

var abs = Math.abs;

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

这引起了我的注意: Math.abs vs custom abs function

更新:

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

我推测这是由于对 Chrome 的 V8 引擎中的内置函数进行了一些优化。

nnnnnn 创建的测试澄清了我想说的:Property shortcut

【问题讨论】:

  • 为什么使用附加变量调用相同的函数会更快。我认为您不了解缓存和按引用传递的工作原理。
  • "abs(-10) 不应该比 Math.abs(-10) 快吗?"呃,你到底为什么会这样想?因为它的字符更少?
  • 只是为了迂腐,JavaScript 函数没有“所有者”。
  • @adeneo - 是的,这是一个测试,使用一种方法对简单对象(在 Chrome 中)更快:jsperf.com/property-shortcut
  • 我推测 Chrome 的 JS 到本机代码编译器有一些数学原语的内在代码,并将内联调用。将函数放入变量中会以某种方式破坏该优化。请注意,在 Firefox 中它们具有相同的性能。

标签: javascript optimization jsperf


【解决方案1】:

Givi 使这个答案变得毫无用处。见 cmets。

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

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

编辑:here's a 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 而这个用于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); }());###
  • Math.abs -> 23609 ; var abs = Math.abs -> 1125。这说明了它......所以我猜 jsperf 是不值得信任的。谢谢吉维。
  • 看看jsFiddle如果你复制源代码并直接粘贴到javascript控制台会更好。
  • 对不起,我弄错了。直接在控制台中测试代码是个坏主意,所以如果你创建新的 html 文件然后在空的 body 标记中传递源代码会更好。 source code
  • 至少在我的机器上运行你的 jsFiddle,它们会产生相似的结果,所以 Math.absvar abs = Math.abs 快 0%,用不同数量的循环进行测试。这只能意味着 javascript 运行的环境对处理速度有很大影响。这意味着我们进行的任何性能测试都应该考虑环境或不被视为绝对/不可撤销的结果(当然也取决于测试本身)。这对 Givi 很有启发,谢谢 :)
猜你喜欢
  • 2018-06-23
  • 2017-06-30
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多