2012-01-16 9 views
5

私は数学的操作を集中的に使用するjavascriptアプリケーションに取り組んでいます。私は出発点として他人の人々のコードに取り組んできた、と私はしばしばネイティブJavaScriptの数学のための回避策を見つけ、そのようJavascriptでの数学オブジェクトの速度

var pi = Math.PI 
var distance = (x * x) + (y * y)/R * R 
var pixels = ~~(x/y) 

...などMathオブジェクトを使用してのパフォーマンスが大幅にヒットがあります?もしそうなら、いくつかの一般的な回避策はありますか?

+1

おそらく、 'Math'メソッドはjavascriptが実装されている言語(典型的なブラウザではCまたはC++)で実装されているので、JavaScriptよりもはるかに高速です –

+5

**測定**パフォーマンスの違い?あなたのすべてのターゲットブラウザー間で? –

+2

まあ 'Math'は「距離」方法を持っていない、とその整数変換は速いかもしれないが、それはまた' Math.floor() 'や'恐らくMath.round() 'よりも意味的に異なるのです。 [jsperf](jsperf.com)を使ってこのようなことをテストできます。 – Pointy

答えて

15

あなたはJavaScriptで計算集約的なものをやって、いくつかの理由である場合は、*(それらの事を覚えているとデビッドMandelinのあなたのエンジンを知って読まなければならない:あなたのJavaScriptが高速作り方プレゼンテーション - PDF、彼はより多くでこれを説明詳細*):

  1. インラインでできます。

  2. 関数呼び出し

  3. オブジェクトへのアクセスは高価で非常に高価で

  4. 多型があなたのパフォーマンスを要することができる、あなたの変数と引数は常に一つだけのデータ型を保持する必要があります。

Mathオブジェクトは、特に低速ではありませんが、とにかくそこdistance()機能を見つけることができません、とMath.method()呼び出しによって閉鎖からそのメソッドにアクセスすることは、非効率的です。

のでsqrtは、もちろん、悪いことよりx*xあなたのために良いかもしれないカスタムrandom機能で、Piがmin、ループ内にキャッシュされなければならないとmaxはおそらく、同様に三角関数や対数スピードについての考えを回避すべきではありません。


P.S:あなたは、((x >= 0 ? x : -x) + 0.5) >> 0のようなものを行うことができますMath.ceil(Math.abs())を置き換えるために、覚えて - 私は「集中的」と言うとき - 私は数クランチ、データ処理、物理学、グラフィックス、そのようなことについて話しています。通常のJavaScriptサイトやRIAの場合は、のものを使用すべきではありません。私はここに提案しています。また、スピードハッキングのほとんどは、彼らが持っていますside effects

+0

ポイント4について...私は本当に理解していません。オブジェクトを持つJSのダックタイピングを避けることはできないので、オブジェクトの多型を避けることはできません。ルックアップはルックアップなので、これはポイント3と同じです。 –

+0

ヒントをお寄せいただきありがとうございます。マイクロオプティマイゼーションよりもアーキテクチャから得られることが多いようです。私のコードはグラフィックスと関連しているので、少しのパフォーマンスを絞り出す必要があります。 – Duopixel

0

私は関数呼び出しに同意しません。 if文と長い特殊関数の中のif文は、多くの小さな一般化関数を持つよく整理されたコードよりも遅いです。

関連する問題