编辑!在大量后续研究表明我的问题没有简单的答案后,我将答案更改为我自己的答案。见下文!
因此,在我上一个问题的后续行动中,我试图更好地处理最佳 Javascript 实践以优化性能。对于以下示例,我正在使用浏览器内分析器在 Chrome 28.0.1500.70 中进行测试。
我已经将一些数学函数封装在一个对象中,这些函数每秒被调用几百 k 次,并试图减少一些执行时间。
我已经通过将父对象本地的本地副本作为被调用函数本身的本地副本进行了一些优化,并获得了不错的(~16%)性能提升。然而,当我从父对象调用另一个函数时,我得到了巨大的(~100%)性能提升。
最初的设置是 calcNeighbors 通过 this.cirInd 调用同伴父对象函数 cirInd。
制作 cirInd 的本地 var 副本并调用它会带来巨大的性能提升,不到 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>
}