インライン化とは
それは何のために使用されますか?
C# で何かをインライン化できますか?
それは何ですか
C および C++ の用語では、 inline キーワードを使用して、パラメーターをスタックにプッシュするオーバーヘッドなしでルーチンを呼び出すようにコンパイラーに指示します。関数は、代わりに、それが呼び出された関数に挿入されたマシンコードを持っています。これにより、特定のシナリオでパフォーマンスが大幅に向上する可能性があります。
危険
「インライン化」を使用した場合の速度の利点は、インライン関数のサイズが大きくなるにつれて大幅に減少します。使いすぎると、実際にはプログラムの実行が遅くなる可能性があります。非常に小さなアクセサー関数をインライン化すると、通常はコード サイズが減少しますが、非常に大きな関数をインライン化すると、コード サイズが劇的に増加する可能性があります。
C# でのインライン化
C# では、インライン化は JIT コンパイラが決定を下す JIT レベルで行われます。現在、明示的にこれを行うことができるメカニズムは C# にありません。JIT コンパイラが何をしているかを知りたい場合は、次を呼び出すことができSystem.Reflection.MethodBase.GetCurrentMethod().Name
ます。メソッドがインライン化されている場合、代わりに呼び出し元の名前が返されます。
C# では、メソッドを強制的にインライン化することはできませんが、メソッドを強制的にインライン化しないようにすることはできます。特定のコールスタックへのアクセスが本当に必要で、インライン展開を削除する必要がある場合は、次を使用できます: MethodImplAttribute
with MethodImplOptions.NoInlining
. さらに、メソッドが仮想として宣言されている場合、JIT によってインライン化されません。この背後にある理由は、呼び出しの最終的なターゲットが不明であるためです。
インライン化の定義と議論については、この質問を参照してください。
C# では、ランタイムが自動的にインライン化を行うため、コンパイラまたはランタイムにインライン化を指示する必要はありません。
PSこの答えはJavaでも正しいです。
インライン化は、特定の関数を呼び出す代わりに、関数の内容が呼び出しサイトで直接行われる場合です。これを行う主な理由は、呼び出しサイトで関数の内容を実行することにより、関数呼び出しのオーバーヘッドを取り除くためです。
これは、最適化手法として使用されます。C# の場合、実際には CLR JIT エンジンに依存して作業が行われます。実行時にメソッドをコンパイルするとき、JIT エンジンはヒューリスティックを使用してインライン関数が適切であり、効果的な最適化になるかどうかを判断します。その場合、インラインが実行されます。
Vance は、インライン化の際に JIT が考慮すべきことに関する素晴らしい記事を持っています: http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the -質問.aspx
C# でインラインを強制する方法はありません。言語はこの構造をサポートしていません。主な理由は、何を最適化する必要があるかについて人々が非常に貧弱な判断を下すためです。JITer の方がはるかに優れています。
エリック・ガンナーソンを引用するには