2011-08-14 17 views
2

現在、私が書いているJavaScriptゲームエンジンで「極端な」最適化を行っています。そして私は数学関数をたくさん使うことに気付きました!私は現在、それらを使用する関数ごとにローカルにキャッシュしています。そこで、以下のコードを使用して、ウィンドウオブジェクトのグローバルレベルでそれらをキャッシュします。JavaScriptの最適化:グローバルに数学関数をキャッシュする

var aMathFunctions = Object.getOwnPropertyNames(Math); 

for (var i in aMathFunctions) 
{ 
    window[aMathFunctions[i]] = Math[aMathFunctions[i]]; 
} 

これに重大な問題や副作用はありますか?ウィンドウ内の既存の関数を上書きすることはできますか?私はメモリフットプリントを劇的に増やしますか?それ以外に何がうまくいかないでしょうか?

編集:以下は私がこれを試してくれるJavaScript最適化について読んだことの抜粋です。

プロパティ深

ネストオブジェクトのドット表記を使用するために 名前空間に最適な方法ですし、あなたのコードを整理します。 Unfutnately、 のパフォーマンスに関しては、これは少し問題になる可能性があります。この種のシナリオで値が にアクセスされるたびに、インタープリターは、その値に到達するためにネストしたオブジェクト をトラバースする必要があります。 の値が深いほど、トラバーサルが増えるほど待ち時間が長くなります。したがって、 名前空間は優れた組織ツールですが、できるだけ浅いものを維持することが、より速いパフォーマンスでは最大の賭けとなります。 YUIライブラリの最新の は、名前空間から入れ子になっている のレイヤ全体を削除するように進化しました。たとえば、YAHOO.util.Animは現在 Y.Animです。

参考:http://www.phpied.com/extreme-javascript-optimization/

+6

あなたのゲームをスピードアップすれば驚くだろう。あなたはパフォーマンスの違いを測定しましたか? – RichieHindle

+0

なぜこれを最初にやっていますか? –

+0

したがって、唯一の違いは、たとえば次のようになります。 'Math.floor'の代わりに' floor'ですか?パフォーマンスの違いがあるかどうかはわかりません。 – pimvdb

答えて

6

編集:が原因this revisionにChromeでもはや問題ではありませはずです。たぶんキャッシングがさらに速くなっています。


グローバル機能を使用すると、処理が遅くなります。 Chromeで

http://jsperf.com/math-vs-global

:メモリ使用量については

sqrt(2);  - 12,453,198 ops/second 
Math.sqrt(2); - 542,475,219 ops/second 

、それは全く逆に、悪いではないでしょうグローバル化。別の参照を作成するだけです。関数自体はコピーされません。

+0

を参照してください。たとえば、var sqrt = Math.sqrtの代わりにMath.sqrtを使用します。 – Tristan

+0

そこのスピードはかなり驚くべき違い! – Bojangles

+0

私はFirefox 5(ブラウザの開発用に使用しています)の答えで提供されたテストを実行しました。数学関数をキャッシュする方が速かったです。今私はそれをするかどうかにちょっと固執しています – Tristan

3

私は実際にはMacの方が速いです。  OS   XとFirefox 5は、50000回の反復で5~の違いがあります。

console.time("a"); 
for (var i=0;i<50000;i++) { 
    var x = Math.floor(12.56789); 
} 
console.timeEnd("a"); 

var floor = Math.floor; 

console.time("b"); 
for (var i=0;i<50000;i++) { 
    var y = floor(12.56789); 
} 
console.timeEnd("b"); 

実際のボーナスは、コードのフットプリントを減らす場合にのみ表示されます。私は他のブラウザーをテストしていないので、他のブラウザーでは1倍、それ以上は遅くなる可能性があります。

問題が生じるでしょうか?なぜあなたはそれらの名前でグローバルな範囲に物事を持っていない限り、それがどうなるかはわかりません。 :)

+0

Chromeでは常に10msほど遅いと言わなければなりません。 – pimvdb

+0

Webkitは最適化の仕方が異なっています。どのような驚き笑;) – epascarello

+0

コードのフットプリントを低下させるのは良いだろうが、パフォーマンスを犠牲にすることではないと私はまだ正直なところ、すべてのそれらの機能をグローバルに追加するかもしれない – Tristan

関連する問題