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

o0'*_*0'. 3 c# optimization inlining unity-game-engine

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

CI会毫不犹豫地对其进行内联,但在Unity/C#中没有办法实现AFAIK(似乎仅适用于.NET 4.5).

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


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

Roy*_* T. 5

在编译时手动强制在C#中嵌入内容没有多大意义.当代码运行时,即时编译器可以根据这些启发式决定内联代码:

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

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

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

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