2011-06-25 10 views
4

ランタイムとメモリに対するclousreとグローバルスコープの関係を定義すると、どのような影響がありますか?JavaScriptの内部関数とパフォーマンス

function a(){ 
     //functions (option A) 
} 
//functions(option B) 

私は

がどのように影響を与えるが、両方の時間とメモリを実行しているだろう、私は1000年の機能を持っていることを言うことができます... Aは関数スコープの利点(閉鎖)がそのオプションを理解できますか?

+1

[ローカル機能をマイクロ最適化していないのですか?](http://stackoverflow.com/questions/4747581/is-not-having-local-functions-a-micro-optimation) – Raynos

+0

+1についてマイクロ最適化 –

+0

[Javascript入れ子関数のパフォーマンス](http://stackoverflow.com/q/19779752/104380) – vsync

答えて

3

内部関数を使用する場合、実行時には後で呼び出すためにコンテキストを割り当てて保存しなければなりません。これを含む関数が呼び出されるたびに実行されます。その結果、内部関数を宣言することは、その関数の周りの囲みスコープ内の変数であるオブジェクトを構築するように機能すると考えるのが便利です。

メモリの量がヒープ上にオブジェクトを割り当てることとほぼ同じであるため、あまり頻繁に実行しないと、これはすべて悪くない場合があります。 (そして、場合によってはこれを避けるためにできる巧妙な最適化がいくつかあります。例えば、関数をローカルスタック空間に割り当てることができる呼び出しスタックに渡すか、またはインライン化を行うなど)。しかし、ほとんどの状況ではまだ割り当て済みなので、ビジーなループや多数の内部関数を作成する際にあまりに多くを使用しないでください。

あなたの質問に答えるには、オプションBの方が一般的に早いでしょう。しかし、これがあなたを落胆させてはいけません!

私の最終的な取り組みは、便利な内部関数が小さなランタイムオーバーヘッドよりも完全に優れていることです。パフォーマンスのボトルネックと判明した場合は、戻って最適化してください。

+0

大変ありがとう!その点で既知のベンチマークはありますか? (私はv8の方が好きです) –

+0

あなたは自分で書くことができますが、何も教えてくれません。決して呼び出されない内部メソッドはインライン化でき、スタックスコープを決してエスケープしないオブジェクトと同様に、割り当てをスキップできます。コードを調整する必要がある場合は、クロムのプロファイラを使用して、どこが遅くなっているかを把握し、そのセクションを最適化します。実際には、内部関数のパフォーマンスを調整することについて心配する必要はありません(プロファイラーが本当にあなたが減速していることを教えていない限り)) – Mikola

+1

また、キャッシングトリックは非常に便利です。 – Raynos

-1

パフォーマンス

非常に小さなベンチマークケース:

#1インナー機能:外http://jsfiddle.net/bMHgc/

#2機能:私のマシンでhttp://jsfiddle.net/sAVZn/

:(5000 * 1000倍)

#1 - 700ms

#2 - 80ミリ秒

メモリ

彼らはほぼ同じで...

可能であればそれはあなたのコードクリーナーを作ることができるので、私は、オプションAをお勧めします。

+1

ベンチマークにjsperfを使用します。私は、オプションAはあなたのコードをきれいにすると思います。また、大きさのオーダーは「ほぼ同じ」ではありません – Raynos

+2

これらは同等のテストケースではありません。あなたの最初のテストケースは、反復ごとに新しい関数を作成しています.2番目のテストケースは新しい関数ではありません。 –

+0

オススメして申し訳ありませんが、私は 'option A' –

関連する問題