編集!多くのフォローアップ調査で、私の質問に対する単純な答えがないことが示された後、私は自分自身の答えに変更しました。下記参照!
そのため、前回の質問のフォローアップとして、パフォーマンスを最適化するための Javascript のベスト プラクティスをよりよく理解しようとしています。次の例では、ブラウザー内プロファイラーを使用して Chrome 28.0.1500.70 でテストしています。
1 秒間に数百 k 回呼び出されるオブジェクトにカプセル化された数学関数がいくつかあり、実行時間を少し短縮しようとしています。
親オブジェクトのローカル コピーを呼び出された関数自体のローカルとして作成することで、既にいくつかの最適化を行っており、適切な (~16%) パフォーマンスの向上が得られました。ただし、親オブジェクトから別の関数を呼び出すために同じことを行ったところ、パフォーマンスが大幅に (~100%) 向上しました。
元のセットアップは、this.cirInd を介して仲間の親オブジェクト関数 cirInd を呼び出す calcNeighbors でした。
cirInd のローカル var コピーを作成し、それを呼び出すと、パフォーマンスが大幅に向上し、以前の calcNeighbors の実行時間の半分以下になりました。
ただし、cirInd を calcNeighbors のインライン関数にすると、親オブジェクトから呼び出した場合と同じようにパフォーマンスが低下しました。
これには本当に困惑しています。これは Chrome のプロファイラーの癖かもしれませんが (2 番目のケースでは 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>
}