如果启用了优化,JIT会始终内联此方法吗?

时间:2009-08-27 18:38:40

标签: c# jit heuristics inline-method

我不期待肯定的是或否。你可能拥有的任何知识我都会考虑作为答案。

private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate)
{
    return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C");
}

1 个答案:

答案 0 :(得分:22)

内联是JIT的实现细节,而不是C#编译器的实现细节。来自Eric Gunnerson's blog

  

JIT使用了许多启发式方法   决定方法是否应该   在内衬。   以下是一份清单   其中更重要的(注意   这不是详尽无遗的):

     
      
  • 不会内联大于32字节IL的方法。
  •   
  • 虚拟函数未内联。
  •   
  • 具有复杂流量控制的方法不会内联。复杂   流量控制是其他任何流量控制   比if / then / else;在这种情况下,   切换或同时。
  •   
  • 不包含异常处理块的方法   内联,虽然抛出的方法   例外仍然是候选人   内联。
  •   
  • 如果方法的任何形式参数都是结构体,那么该方法将会   没有内联。
  •   

虽然您的方法非常简短而且不是很复杂,因此它可能与启发式方法相匹配,Nullable<T>struct所以我猜你的方法没有内联。

根据经验,如果内联此方法可以提高性能,JIT将内联此方法;否则它不会。但这实际上是JIT的一个实现细节,你应该编写代码:

  

我会仔细考虑明确编写这些启发式,因为它们可能会在未来版本的JIT中发生变化。不要妥协方法的正确性,以保证它将被内联。

编辑:显然有关结构未被内联的内容已经过时了;更新的信息可以在Vance Morrison's blog找到。