我是否需要担心Unity / C#中的内联?

时间:2014-06-22 21:45:25

标签: c# optimization unity3d inlining

为了代码清晰,我有时创建一个非常明显内联的函数,无论是包装器,还是仅在单个点中调用的函数,或者应该经常调用的短函数,并且< EM>快

在C中,我会毫不犹豫地内联它,但在Unity / C#中没有办法做到这一点AFAIK(this似乎只能在.NET 4.5中使用)。

我是否可以相信编译器足够聪明以实际内联,或者我有时会牺牲代码清晰度来提高性能,不信任编译器?


当然这取决于具体情况,过早优化是邪恶的,你应该分析而不是猜测。但是,对该主题的总体概述可能仍然可以作为指导,以改进。

1 个答案:

答案 0 :(得分:5)

在编译时手动强制插入C#并不是很有意义。当代码运行时,即时编译器可以根据这些启发式决定内联代码:

http://blogs.msdn.com/b/ericgu/archive/2004/01/29/64717.aspx

  
      
  • 不会内联大于32字节IL的方法。
  •   
  • 虚拟函数未内联。
  •   
  • 具有复杂流量控制的方法不会内联。复杂流量控制是除if / then / else之外的任何流量控制;在这种情况下,切换或while。
  •   
  • 不会内联包含异常处理块的方法,但抛出异常的方法仍然是内联的候选方法。
  •   
  • 如果任何方法的正式参数是结构,则不会内联该方法。
  •   

如果你完全确定该方法必须是内联的,你可以使用上面的这些方法来使该方法更具吸引力。

MethodImplOptions.AggressiveInlining主要用于跨越程序集边界内联,我不相信即时编译器可以做的事情(但我必须检查它)。