if分支判断的性能分析

        在开发过程,特别是繁重的死循环任务中(eg. 网络开发中对每个数据包进行加密解密)如果大量使用if会造成性能的下降。之前,这一意识只是一种直觉,今天特意去查了一下。网上很多的答案是不会影响性能,性能的高低看你判断表达式的设计,这大概也是大多数人的结论:先判断,再选择分支执行操作,对性能的影响应该不大吧。

        其实不然,CPU在运行到if的时候,不会先判断condition然后再选择进入if-else的哪一个分支。它们真正做的是直接进入一个分支执行,如果猜错则回滚此分支的操作然后换另一个分支执行。如果CPU每次都猜对,就会让程序性能接近没有if-else的情形;反之则会造成开销。那么如何让CPU猜对呢?如果condition 大部分时间都是true,少部分时间是false,那么CPU 就比较好猜,反之,如果condition的值是一个随机值,那么CPU每次就得“瞎猜”,猜对的概率就会低了。

        CPU运行时不是一条命令一条命令的执行,而是一下读进多条命令,并且对这些命令进行优化,生成流水线(pipeline)。优化后的流水线的运行效率是非常高的。生成流水线也是一个耗时的工作。CPU遇到if的条件语句时根据分支预测器的结果选择跳转还是不跳转。并且把相应分支里的命令载入生成流水线。CPU同时还会并行地执行条件语句。如果对就继续执行,如果错就把当前分支的流水线抛弃然后载入另一个分支生成流水线。所以如果每次都猜对,程序的运行效率就会基本和没有if差不多。

        所以再日常开发中要尽量避免在死循环等大量任务中使用if-else判断,可以结合数组与指针等进行避免。

参考知乎:https://www.zhihu.com/question/51107242

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值