6

据我所知,没有办法暗示 c# 编译器内联一个特定的函数,我猜它是这样设计的。

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

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

任何关于这个主题的光都将不胜感激。

谢谢。

4

5 回答 5

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

于 2008-10-29T23:39:58.820 回答
4

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

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

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

于 2008-10-29T23:43:52.260 回答
4

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

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

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

于 2012-12-14T10:40:12.540 回答
3
if(performance < ACCEPTABLE){
   if(profiler.showsAffectOfMethodCallOverhead() && seriouslyWeDoubleChecked()){
      if(runtimeContext.isReallyStableAndNotProneToChange() && weNeedToGetThisThingBatOutOfHellFast()){
          return thisIsOneOfTheFewTimesWhenANativeExternalFunctionMayBeWorthIt();
      }
   }
 }
 return dontWorryAboutIt();

如果您正在执行那条罕见的路径,请打破您的 C 或 ASM。

于 2008-10-30T00:43:23.230 回答
1

替代文字 http://web.ics.purdue.edu/~ssanty/images/1.gif

于 2008-10-29T23:54:39.040 回答