为了代码清晰,我有时创建一个非常明显内联的函数,无论是包装器,还是仅在单个点中调用的函数,或者应该经常调用的短函数,并且< EM>快
在C中,我会毫不犹豫地内联它,但在Unity / C#中没有办法做到这一点AFAIK(this似乎只能在.NET 4.5中使用)。
我是否可以相信编译器足够聪明以实际内联,或者我有时会牺牲代码清晰度来提高性能,不信任编译器?
当然这取决于具体情况,过早优化是邪恶的,你应该分析而不是猜测。但是,对该主题的总体概述可能仍然可以作为指导,以改进。
答案 0 :(得分:5)
在编译时手动强制插入C#并不是很有意义。当代码运行时,即时编译器可以根据这些启发式决定内联代码:
http://blogs.msdn.com/b/ericgu/archive/2004/01/29/64717.aspx
- 不会内联大于32字节IL的方法。
- 虚拟函数未内联。
- 具有复杂流量控制的方法不会内联。复杂流量控制是除if / then / else之外的任何流量控制;在这种情况下,切换或while。
- 不会内联包含异常处理块的方法,但抛出异常的方法仍然是内联的候选方法。
- 如果任何方法的正式参数是结构,则不会内联该方法。
如果你完全确定该方法必须是内联的,你可以使用上面的这些方法来使该方法更具吸引力。
MethodImplOptions.AggressiveInlining主要用于跨越程序集边界内联,我不相信即时编译器可以做的事情(但我必须检查它)。