C#コンパイラまたはJITはどのレベルでアプリケーションコードを最適化しますか?

StackOverflow https://stackoverflow.com/questions/650652

質問

この情報を知り、コードサイズを小さくして、コンパイラまたはJITによって行われることを最適化する時間を無駄にしないようにします。

例:

コンパイラがプロパティのget関数の呼び出しをインライン化すると仮定した場合、関数呼び出しを避けるために戻り値をローカル変数に保存する必要はありません。

何が起こっているのかを説明する適切なリファレンスをお勧めしますか?

役に立ちましたか?

解決

これらの記事をご覧ください:

JIT最適化-(Sasha Goldshtein-CodeProject)
Jitの最適化:インライン化I(David Notario)
Jit Optimizations:Inlining II(David Notario)

正直に言うと、このレベルのミクロの詳細についてあまり心配するべきではありません。コンパイラー/ JIT'erにこれを心配させてください。ほとんどすべての場合よりも優れています。 早期最適化にこだわらないでください。コードを機能させることに集中し、(a)十分に速く実行されない場合、(b)「サイズ」の問題がある場合は、後で最適化を心配します。

他のヒント

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


JITがプロパティゲッターをインライン化することを想定することはできません。そうするかもしれないし、しないかもしれない多くの理由があります。メソッド本体のサイズ、仮想、値と参照のタイプ、アーキテクチャ、アタッチされたデバッガなど

<!> quot;巻き上げ<!> quot;まだ場所があり、コードがタイトループで繰り返し呼び出される場合 も節約できます。例:

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

(上記のforforeachの議論を忘れてください-これは直交的な議論です)。上記では、<!> quot; hoist <!> quot;パフォーマンスに役立ちます。しかし、単に混乱させるために-配列の場合は逆であり、持ち上げる方がより効率的です:

for(int i = 0 ; i < arr.Length ; i++) {...}

JITはこれを認識し、境界チェックを削除します(配列は固定サイズなので)。

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

メソッドの呼び出し回数が多く、本当にインライン化する場合は、スパゲッティコードを犠牲にして自分でインライン化できます。

アルゴリズムを分析することをお勧めします。メソッドをインライン化すると速度が大幅に低下することはありませんが、アルゴリズムを改善すると実行時間が数時間から数秒に短縮されます。

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

特定の質問については、問題の関数呼び出しが hot である場合、おそらく言うでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top