C#で関数のインライン展開を強制する方法はありますか?
-
05-07-2019 - |
質問
私が知っている限りでは、c#コンパイラに特定の関数をインライン化するように示唆する方法はなく、設計上はそのようだと思います。
また、プログラマにインライン化するものとそうでないものを指定させないことは、一般的には良い考えだと思います。JITコンパイラよりも賢いと思うことを意味するからです(実際に尊敬している人への敬意)。しかし、ターゲットマシンでコードを達成する方法に関係なく、コードの重要な部分を非常に高速にする必要があると指定したい場合はどうすればよいでしょうか。まだ、あなたはそのようなことをすることができません、そして、c#言語とJITの両方がこの機能をサポートするかどうかと思います。
私の場合、ターゲットマシンが何であるかを知っており、関数のインライン化がパフォーマンスの向上に役立つことを知っています。これにより、関数のインライン化を実施する唯一の方法は、JITがどのような状況でそれを行うかを知ることだけだと思いますが、それも良い考えだとは思いません。
被写体に光を当てていただければ幸いです。
ありがとう。
解決
.Net 4.5の登場により、状況は少し変わりました。
属性 [MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
これにより、可能な限りJITによってインライン化されます。
このブログで詳細をご覧ください。
他のヒント
簡単な答え:いいえ
長答: http://blogs.msdn。 com / ericgu / archive / 2004/01/29 / 64644.aspx
インライン化の基準: http://blogs.msdn .com / davidnotario / archive / 2004/11/01 / 250398.aspx および http://blogs.msdn.com/ericgu/archive/2004/01/29/64717.aspx
インライン化の基準に関する最後の2つのリンクで、インラインではない構造体に関するリンクは古いことに注意してください。更新された情報は、 http://blogs.msdn.com/vancem/archive/2008/05/12/what-s-coming-in-net-runtime-performance-in -version-v3-5-sp1.aspx
最近これをベンチマークしました:
http://www.gfilter.net/junk/BubblesortBenchmark.jpg (高いほど悪い)
おわかりのように、CLRとJVMはどちらも、メソッドのインライン化がこれまでよりもはるかに優れています。
if(performance < ACCEPTABLE){
if(profiler.showsAffectOfMethodCallOverhead() && seriouslyWeDoubleChecked()){
if(runtimeContext.isReallyStableAndNotProneToChange() && weNeedToGetThisThingBatOutOfHellFast()){
return thisIsOneOfTheFewTimesWhenANativeExternalFunctionMayBeWorthIt();
}
}
}
return dontWorryAboutIt();
そのまれなパスを実行している場合は、CまたはASMを分割します。