有没有一种方法可以在c#中强制执行函数内联

本文关键字:强制执行 函数 方法 一种 有没有 | 更新日期: 2023-09-27 17:47:46

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

我还认为,不让程序员指定内联和不内联通常是一个好主意,因为这意味着你认为自己比JIT编译器更聪明(我向那些真正聪明的人致敬),但是,如果我想指定代码的关键部分需要非常快,无论如何在目标机器上实现它,该怎么办?到目前为止,你还不能做这样的事情,我想知道c语言和JIT是否都会支持这个功能。

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

任何关于这个问题的线索都将不胜感激。

谢谢。

有没有一种方法可以在c#中强制执行函数内联

简短回答:没有

长话短说: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

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

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

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

有关详细信息,请参阅此博客。

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

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。

alt-texthttp://web.ics.purdue.edu/~ssanty/images/1.gif