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#关注快速开发,不必理会这些开销吧。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值