如果启用优化将JIT总是内联这个方法?(If optimizations are enabled w

2019-08-02 21:03发布

我不期待一个明确的是或否。 任何知识,你可能有,我会考虑作为一个答案。

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

Answer 1:

内联是JIT的实现细节,而不是C#编译器。 从埃里克Gunnerson的博客 :

该JIT使用了一些启发式的决定方法是否应该在内衬。 以下是那些较为显著的列表(注意,这并不详尽):

  • 方法是大于32个字节IL不会被内联。
  • 虚函数不内联。
  • 有复杂的流程控制方法不会在成荫。 复杂的流控制是任何流量控制以外的if / then /别的; 在这种情况下,切换或同时。
  • 包含异常处理模块的方法没有内联,虽然抛出异常的方法仍然是内联的候选人。
  • 如果有任何的方法的形参的结构,该方法将无法进行内联。

虽然你的方法很短,不是很复杂,所以它可能匹配的启发式扫描, Nullable<T>是一个struct ,所以我猜你的方法是不是内联。

作为一个经验法则,如果内联这个方法可以提高性能,在JIT将内联这个方法; 否则它不会。 但是,这是真正的JIT并没有什么,你应该代码的实现细节:

我会仔细考虑明确地编码这些启发式 ,因为他们可能会在JIT的未来版本中改变。 不妥协的方法的正确性,试图保证它会被内联。

编辑:显然,关于未内联结构的位外的日期; 更新的信息可以在这里找到万斯莫里森的博客 。



文章来源: If optimizations are enabled will the JIT always inline this method?