有没有办法在c#中强制执行函数内联?

时间:2008-10-29 23:31:14

标签: c# optimization call overhead inlining

据我所知,没有办法提示c#编译器内联一个特定的函数,我想这就像设计一样。

我还认为不要让程序员指定内联内容和通常不是什么好主意,因为这意味着你认为你比JIT编译器更聪明(我尊重实际的人),但是,如果我想指定代码的关键部分需要以任何代价非常快地完成,无论如何在目标机器上实现它,该怎么办?到目前为止,你不能做这样的事情,我想知道c#语言和JIT是否会支持这个功能。

在我的情况下,我知道目标机器是什么,我知道函数内联将有助于提高性能。这让我觉得强制执行函数内联的唯一方法是了解JIT在什么情况下会这样做,但我认为这也不是一个好主意,

对此主题的任何启发都将非常感激。

感谢。

5 个答案:

答案 0 :(得分:10)

简答:没有

答案很长:http://blogs.msdn.com/ericgu/archive/2004/01/29/64644.aspx

内联标准:http://blogs.msdn.com/davidnotario/archive/2004/11/01/250398.aspxhttp://blogs.msdn.com/ericgu/archive/2004/01/29/64717.aspx

请注意,在关于内联标准的最后两个链接中,关于不是内联的结构的链接是过时的;更新的信息可在以下网址找到:http://blogs.msdn.com/vancem/archive/2008/05/12/what-s-coming-in-net-runtime-performance-in-version-v3-5-sp1.aspx

答案 1 :(得分:4)

我最近对此进行了基准测试:

http://www.gfilter.net/junk/BubblesortBenchmark.jpg(越高越好)

正如您所知,CLR和JVM在方法内联方面都比以往任何时候都要好得多。

答案 2 :(得分:4)

随着.Net 4.5的出现,情况发生了一些变化。

您现在可以使用属性[MethodImplAttribute(MethodImplOptions.AggressiveInlining)]修饰一个方法,如果可能的话,它将使JIT内联它。

有关详细信息,请参阅this blog

答案 3 :(得分:3)

if(performance < ACCEPTABLE){
   if(profiler.showsAffectOfMethodCallOverhead() && seriouslyWeDoubleChecked()){
      if(runtimeContext.isReallyStableAndNotProneToChange() && weNeedToGetThisThingBatOutOfHellFast()){
          return thisIsOneOfTheFewTimesWhenANativeExternalFunctionMayBeWorthIt();
      }
   }
 }
 return dontWorryAboutIt();

如果您正在执行这条罕见的路径,请中断您的C或ASM。

答案 4 :(得分:1)