在开发过程,特别是繁重的死循环任务中(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判断,可以结合数组与指针等进行避免。