为了代码清晰,我有时会创建一个很明显应该内联的函数,它可以是包装器,也可以是仅在单点调用的函数,或者是应该经常调用且速度很快的短函数。
在 CI 中会不加思索地内联它,但在 Unity/C# 中没有办法做到这一点 AFAIK(这似乎只在 .NET 4.5 上可用)。
我是否可以相信编译器足够聪明以实际巧妙地内联,或者我最好有时为了性能而牺牲代码清晰度,不信任编译器?
当然这取决于具体情况,过早的优化是邪恶的,你应该分析而不是猜测。然而,这个主题的一般概述可能仍然可以作为指导,以进行改进。
为了代码清晰,我有时会创建一个很明显应该内联的函数,它可以是包装器,也可以是仅在单点调用的函数,或者是应该经常调用且速度很快的短函数。
在 CI 中会不加思索地内联它,但在 Unity/C# 中没有办法做到这一点 AFAIK(这似乎只在 .NET 4.5 上可用)。
我是否可以相信编译器足够聪明以实际巧妙地内联,或者我最好有时为了性能而牺牲代码清晰度,不信任编译器?
当然这取决于具体情况,过早的优化是邪恶的,你应该分析而不是猜测。然而,这个主题的一般概述可能仍然可以作为指导,以进行改进。
在编译时在 C# 中手动强制内联没有多大意义。当代码运行时,即时编译器可以根据这些启发式决定内联代码:
http://blogs.msdn.com/b/ericgu/archive/2004/01/29/64717.aspx
- 大于 32 字节 IL 的方法将不会被内联。
- 虚函数没有内联。
- 具有复杂流控制的方法不会被内联。复杂流控制是除 if/then/else 之外的任何流控制;在这种情况下,切换或同时。
- 包含异常处理块的方法不是内联的,尽管抛出异常的方法仍然是内联的候选方法。
- 如果方法的任何形式参数是结构,则该方法将不会被内联。
如果您绝对确定该方法必须是内联的,则可以使用上述这些启发式方法使该方法对内联更具吸引力。
MethodImplOptions.AggressiveInlining 对于跨程序集边界内联最有用,我不相信即时编译器可以做到这一点(但我必须检查一下)。