質問

インライン化とは何ですか?

それは何のために使用されますか?

C#で何かをインライン化できますか?

役に立ちましたか?

解決

概要

CおよびC ++の用語では、インラインキーワードを使用して、パラメーターをスタックにプッシュするオーバーヘッドなしでルーチンを呼び出すようコンパイラーに指示します。関数は、代わりに、呼び出された関数にマシンコードが挿入されます。これにより、特定のシナリオでパフォーマンスが大幅に向上する可能性があります。

危険

「インライン化」を使用すると速度が向上します。インライン関数のサイズが大きくなると、大幅に減少します。過剰使用は、実際にプログラムの実行速度を低下させる可能性があります。非常に小さなアクセサー関数をインライン化すると、通常、コードサイズが減少しますが、非常に大きな関数をインライン化すると、コードサイズが劇的に増加します。

C#でのインライン化

C#では、JITコンパイラーが決定を行うJITレベルでインライン化が行われます。現在、C#には明示的にこれを実行できるメカニズムはありません。 JITコンパイラーが何をしているかを知りたい場合は、実行時に System.Reflection.MethodBase.GetCurrentMethod()。Name を呼び出すことができます。メソッドがインライン化されている場合、代わりに呼び出し元の名前を返します。

C#では、メソッドを強制的にインライン化することはできませんが、メソッドを強制的にインライン化することはできません。特定のコールスタックに本当にアクセスする必要があり、インライン化を削除する必要がある場合は、 MethodImplOptions.NoInlining MethodImplAttribute を使用できます。さらに、メソッドが仮想として宣言されている場合、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-question.aspx

C#にインラインを強制する方法はありません。この言語はこの構成をサポートしていません。主に、人々は最適化すべきものについて非常に貧弱な判断者だからです。 JITerの方がはるかに優れています。

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