C#inline内联函数探索

      学过程序编译的人知道,调用函数需要CPU执行参数压栈、寄存器保存与恢复、跳转指令等操作,开销比较大,高频繁的调用函数对性能有影响,在C/C++语言里产生了Macro宏,由于宏不是函数不会产生上述开销,是一种比较好的优化,但宏不是强类型编程,于是VC++产生了inline内联函数,inline优化就是将内联函数展开,就没有了函数调用的CPU开销,性能上等同于宏,而且是强类型编程。

        我的某些C#函数需要高性能,也就想到通过inline实现,但在Visual Studio 2010没找到inline方法,查询大量网上资料,才知道目前为止只有C++支持inline,C#4.0从源码到CLR和IL都不支持内联函数,期待以后的C#5.0或更高版本可以支持inline。
 

        虽然C#不支持inline,但是JIT支持自动inline,即将IL转成真正机器码时,会自动将某些函数进行inline展开,只是条件非常苛刻,网上提到JIT自动进行inline展开的一些选择依据:

1)函数内部有循环语句、catch语句等复杂结构,都不做inline优化。
2)函数体比较长的不做inline优化,只有比较简单的才可能inline优化。(有人说IL不足32字节才做inline),
2)编译成机器码时,inline展开的代码比函数调用更短的,一定做inline。(注:如果参数多而代码少,就符合此情况)


   从上述可知:
1) property适合自动inline优化,不必担心property的性能比Field字段低,
2) 如果期望inline优化的函数,一定要写得小,力争编译后的IL不超过32字节。

其实 是否做inline优化应该从调用的频繁度考虑,而JIT无法了解频繁度,因此自动inline优化效果并不理想,网上许多人都讨论过这点,但微软就是不支持C#的inline,也许微软认为C++才需要关心性能,而C#关注快速开发,不必理会这些开销吧。

转至:https://blog.csdn.net/tanxueguang/article/details/7454060

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页