Javascript 为什么在没有所有者的情况下调用函数会比较慢?

Javascript 为什么在没有所有者的情况下调用函数会比较慢?,javascript,optimization,jsperf,Javascript,Optimization,Jsperf,如果我这样做: var abs=Math.abs abs(-10)不应该比Math.abs(-10)快吗?因为abs是直接调用的 这引起了我的注意: 更新: 在Internet Explorer 11中执行的相同测试显示了完全不同的结果: 我推测这是由于对Chrome V8引擎的内置功能进行了一些优化 由此创建的测试澄清了我想说的内容: 这个答案被Givi弄得一文不值。请参阅评论。 在用户定义的对象中查找用户定义的函数比查找绑定到局部变量的函数要慢,因此您基本上是对的 但是,查找Math.*

如果我这样做:

var abs=Math.abs

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

这引起了我的注意:

更新:

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

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

由此创建的测试澄清了我想说的内容:
这个答案被Givi弄得一文不值。请参阅评论。

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

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

编辑:演示
Math.*
函数如何比它们的
var x=Math.x
对应函数快,而对用户定义的函数做同样的操作则不是。这就是V8引擎的工作原理。

编辑#2:刚才我注意到你的问题中有这样一句话:

我推测这是由于对内置软件进行了一些优化 Chrome V8发动机的功能


我不是100%确定,但看起来确实如此,是的。

为什么使用附加变量调用同一个函数会更快。我认为你不明白缓存和引用传递是如何工作的。“abs(-10)不应该比Math.abs(-10)快吗?”呃,你到底为什么这么想?因为它的字符更少?只是为了学究,JavaScript函数没有“所有者”。@adeneo-是的,这里有一个测试,在Chrome中,对于一个简单的对象,它的速度更快,只有一个方法:我推测Chrome的JS到本机代码编译器有一些数学原语的内在代码,并将内联调用。将函数放入变量会以某种方式破坏优化。请注意,在Firefox中,它们具有相同的性能。打开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是不可信的。谢谢Givi。如果您复制源代码并直接粘贴到javascript控制台,查看会更好。对不起,我犯了一个错误。直接在控制台中测试代码是个坏主意,所以若您创建新的html文件,然后在空的body标记中传递源代码,那个就更好了。至少在我的机器上运行JSFIDLE,它们会产生类似的结果,因此
Math.abs
var abs=Math.abs
快0%,使用不同数量的循环进行测试。这只能意味着javascript运行的环境在处理速度上有很大的不同。这意味着我们进行的任何性能测试都应该考虑到环境,或者不被视为绝对/不可撤销的结果(当然也取决于测试本身)。这是非常有启发性的Givi,谢谢:)