2009-03-16 13 views
8

私はコードサイズを小さくするためにこの情報を知りたいので、私は自分の時間を無駄にせず、コンパイラやJITによって行われることを最適化します。例えばC#コンパイラまたはJITのどのレベルでアプリケーションコードを最適化しますか?

:私たちは、コンパイラのインラインにプロパティのget関数の呼び出しを想定した場合

ので、私は、関数呼び出しを避けるために、ローカル変数に戻り値を保存する必要はありません。

何が起こっているかを説明する良い参考資料をお勧めしますか?

答えて

18

あなたはこれらの記事を見てみたいことがありますが、マイクロこのレベルの詳細についてあまり心配するべきではありません正直に言うと

JIT Optimizations - (Sasha Goldshtein - CodeProject)
Jit Optimizations: Inlining I (David Notario)
Jit Optimizations: Inlining II (David Notario)

。コンパイラ/ JIT'erがあなたのためにこれを心配するようにしましょう。あなたがほとんどすべての場合よりも、それが良いです。 Premature Optimisationにハングアップしないでください。あなたのコードを作業に集中させ、後で(a)それが十分に速く動かない、(b)あなたが「サイズ」の問題を持っている場合、後で最適化について心配してください。

17

パフォーマンスが心配な場合は、プロファイラを実行します。 次に変更コードです。 100万年後には、時間がどこにあるのかを正確に100%推測することはないでしょう。 0.02%のタイミングを変更し、その負担の62%を占める方法を残すことができます。あなたはそれを悪化させる可能性もあります。プロファイラと証拠がなければ、あなたは目が見えません。


あなたはは、JITは、プロパティのゲッターをインライン化しますを負いかねます。そうすることができるかどうかは、多くの理由があります。

"Hoisting"にはまだ場所がありますが、の場合はのコードは繰り返しタイトループで呼び出されます。例えば:

var count = list.Count; 
for(int i = 0 ; i < count ; i++) {...} 

(上記FR forforeach対議論を忘れて - これは、直交議論です)。上記では、「ホイスト」がパフォーマンスに役立つでしょう。しかし、単に本当にが混乱することにする - それは反対であり、それはないホイストに、より効率的である、配列でそれ:

JITはこれを認識し、配列が固定されているとして(境界チェックを削除し
for(int i = 0 ; i < arr.Length ; i++) {...} 

サイズ)。

+0

私はその最後のことについて知りませんでした!知ってよかった、ありがとう! – Groo

+0

情報ありがとうございますが、私はこの情報の良い参照について質問しています –

+2

私のポイントは、*いいえ*参照は本当にこれであなたを助けるでしょう。 **プロファイラ**が行います。 –

1

これは、あなたが見てはならない種類のマイクロ最適化のようです。私が誤解していないなら、どのような最適化が適用されるかは、アーキテクチャとCLRのバージョンによって決まります。

あなたのメソッドがそれほど多く呼び出されていて、本当ににインライン化したい場合は、スパゲッティコードを使用してインライン展開できます。

あなたのアルゴリズムを分析することをお勧めします。メソッドをインライン化すると速度の大小は決まりませんが、より良いアルゴリズムでは実行時間が数時間から数秒に短縮されます。

-1

JITによって実行される最も強力な最適化は、通常インライン展開です。 JITは数百の関数を深くインライン化することもできます(私はJikesRVMのこの数字を聞いた)。インライン化が常に可能ではないものをインライン化し、必要に応じて後で取り戻すこともできます(動的非最適化と呼ばれます)。

概要はhttp://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.htmlです。

具体的な質問については、質問の関数呼び出しがの場合はと言われます。

関連する問題