Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在c#中实现函数内联?_C#_Optimization_Call_Overhead_Inlining - Fatal编程技术网

有没有办法在c#中实现函数内联?

有没有办法在c#中实现函数内联?,c#,optimization,call,overhead,inlining,C#,Optimization,Call,Overhead,Inlining,据我所知,没有办法提示c#编译器内联一个特定的函数,我猜设计就是这样 我还认为,不让程序员指定内联和非内联通常是一个好主意,因为这意味着您认为自己比JIT编译器更聪明(我向那些真正聪明的人表示敬意),但是,如果我想指定代码的关键部分需要以任何代价都非常快,该怎么办,无论如何在目标机器上实现它?到目前为止,你还不能做这样的事情,我想知道c语言和JIT是否都会支持这个特性 在我的例子中,我知道目标机器是什么,并且我知道函数内联将有助于提高性能。这让我想到,实施函数内联的唯一方法是了解JIT在什么情况

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

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

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

对这个问题的任何解释都将不胜感激

谢谢。

简短回答:不

长答覆:

内联的标准:和


注意,在最后两个关于内联标准的链接中,关于结构不是内联的链接已经过时;更新信息见:

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

(越高越好)

可以看出,CLR和JVM在方法内联方面都比以往任何时候都要好。

if(性能<可接受){
if(profiler.showsaffectofmethodcallheader()&&seriouslyWeDoubleChecked()){
if(runtimeContext.isreallystable和notpronetochange()&&WENEEDTOGETTHISTHINGBATOOFHELLFAST()){
如果某个外部函数可能有价值,则返回此Isoneofthefefthefest();
}
}
}
return dontWorryAboutIt();

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

随着.NET4.5的出现,情况发生了一些变化

现在,您可以使用属性装饰一个方法,如果可能的话,该属性将使它由JIT内联

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

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