在实际性能优化过程,加了一个if判断整个系统转发性能就有大约5%的下降,下面简单分享一种在没有分支miss条件下,实现取最小值的方法。

一般实现

取两个数最小值,一般代码常见两种写法如下:

  1. 写法一:
1
if(a  < b ) { min = a } else { min = b}
  1. 写法二:
1
min =  a < b ? a:b;

这两种写法只是代码写法不一致,实际都是通过一个if的语句的比较,存在if语句就代码运行过程就存在分支miss,而一个分支的miss的开销范围40到60 cycles;在追求高性能代码,且没有太多的优化点的过程中这是极其宝贵,且这两个分支出现概率都相当,也就不能简单通过likely与unlikely来实现分支预测

无分支miss实现

无分支实现代码如下:

1
min = b ^ ((a ^ b) &-(a<b));

分两种情况分析如下:

当a<b时,-(a<b)为True,表达式等价于min= b ^(a ^ b) = a;

当a>=b时,-(a < b)为False,表达式等价于min= b ^ 0 = b

故可以宏定义如下:

1
#define min(a,b) = (b) ^ ( ((a) ^ (b)) & (-((a)<(b))) )