编辑!在很多后续研究表明我的问题没有简单的答案后,我将自己的答案改为自己的答案。见下文!Javascript嵌套函数调用优化
所以,在后续我的最后一个问题,我想获得最佳的Javascript做法更好地处理来优化性能。对于下面的示例,我使用浏览器中的分析器在Chrome 28.0.1500.70中进行测试。
我有封装在一个对象一些数学函数,它们获取调用几百k次第二,我试图刮了一下的执行时间。
我已经完成了通过使母公司的本地副本对象当地人当地人在被调用函数本身的一些优化,并得到一个体面的(〜16%)的性能提升。但是,当我从父对象调用另一个函数时,我得到了巨大(〜100%)的性能提升。
原来的设置是calcNeighbors呼吁通过this.cirInd同胞父对象功能cirInd。
制作cirInd的局部变量副本,并调用以前一样,而不是给了一个巨大的性能增益,只有不到一半的执行时间calcNeighbors。
然而,使cirInd在calcNeighbors一个内联函数引起的返回到相同的较慢的性能如从父对象调用它。
我真的为此感到困惑。我想这可能是Chrome的探查器中的一个怪癖(CIRInd在第二种情况下根本没有出现),但是当我使用案例2时,在应用程序中肯定会有明显的性能增益。
有人可以解释为什么情况2比情况1快得多,但更重要的是,为什么情况3似乎没有提供任何性能增益?
有问题的功能如下:
从父对象调用:
window.bgVars = {
<snip>
"cirInd": function(index, mod){
//returns modulus, array-wrapping value to implement circular array
if(index<0){index+=mod;}
return index%mod;
},
"calcNeighbors": function(rep){
var foo = this.xBlocks;
var grid = this.cGrid;
var mod = grid.length;
var cirInd = this.cirInd;
var neighbors = grid[this.cirInd(rep-foo-1, mod)] + grid[this.cirInd(rep-foo, mod)] + grid[this.cirInd(rep-foo+1, mod)] + grid[this.cirInd(rep-1, mod)] + grid[this.cirInd(rep+1, mod)] + grid[this.cirInd(rep+foo-1, mod)] + grid[this.cirInd(rep+foo, mod)] + grid[this.cirInd(rep+foo+1, mod)];
return neighbors;
},
<snip>
}
通过局部变量调用:
window.bgVars = {
<snip>
"cirInd": function(index, mod){
//returns modulus, array-wrapping value to implement circular array
if(index<0){index+=mod;}
return index%mod;
},
"calcNeighbors": function(rep){
var foo = this.xBlocks;
var grid = this.cGrid;
var mod = grid.length;
var cirInd = this.cirInd;
var neighbors = grid[cirInd(rep-foo-1, mod)] + grid[cirInd(rep-foo, mod)] + grid[cirInd(rep-foo+1, mod)] + grid[cirInd(rep-1, mod)] + grid[cirInd(rep+1, mod)] + grid[cirInd(rep+foo-1, mod)] + grid[cirInd(rep+foo, mod)] + grid[cirInd(rep+foo+1, mod)];
return neighbors;
},
<snip>
}
调用在线:
window.bgVars = {
<snip>
"calcNeighbors": function(rep){
var foo = this.xBlocks;
var grid = this.cGrid;
var mod = grid.length;
function cirInd(index, mod){
//returns modulus, array-wrapping value to implement circular array
if(index<0){index+=mod;}
return index%mod;
}
var neighbors = grid[cirInd(rep-foo-1, mod)] + grid[cirInd(rep-foo, mod)] + grid[cirInd(rep-foo+1, mod)] + grid[cirInd(rep-1, mod)] + grid[cirInd(rep+1, mod)] + grid[cirInd(rep+foo-1, mod)] + grid[cirInd(rep+foo, mod)] + grid[cirInd(rep+foo+1, mod)];
return neighbors;
},
<snip>
}
“为什么3的情况下,似乎没有给出任何性能增益” ---为什么要移动一个功能相同的范围内做一些性能提升? – zerkms
不是100%相关的但仍然有用:https://developers.google.com/v8/design#prop_access – zerkms
#3产生一个新的函数cirInd()的每个调用,而#2回收的同一个每次通话。更少的激活创建=更快的运行时间和更少的垃圾清理。 – dandavis