if-else 分支预测

来源:互联网 发布:软件类上市公司 编辑:程序博客网 时间:2024/05/01 00:30

关于if-else分支预测Branch_predictor的分析


[cpp] view plain copy
print?
  1. #ifdef __GNUC__  
  2. #define LIKELY(x)           (__builtin_expect(!!(x), 1))  
  3. #define UNLIKELY(x)         (__builtin_expect(!!(x), 0))  
  4. #else  
  5. #define LIKELY(x)           (x)  
  6. #define UNLIKELY(x)         (x)  
  7. #endif  
#ifdef __GNUC__
#define LIKELY(x) (__builtin_expect(!!(x), 1))#define UNLIKELY(x) (__builtin_expect(!!(x), 0))#else#define LIKELY(x) (x)#define UNLIKELY(x) (x)#endif
有时候,我们在看linux的源码时,会看到如下类似的代码:

[cpp] view plain copy
print?
  1. if (UNLIKELY(fd < 0))  
  2. {  
  3.     /* Do something */  
  4. }  
  5. else  
  6. {  
  7.      /* Do other something */  
  8. }  
if (UNLIKELY(fd < 0)){    /* Do something */}else{     /* Do other something */}

[cpp] view plain copy
print?
  1. if (LIKELY(!err))  
  2. {  
  3.     /* Do something */  
  4. }  
  5. else  
  6. {  
  7.    /* Do other something */  
  8. }  
if (LIKELY(!err)){    /* Do something */}else{   /* Do other something */}

LIKELY 作用是告诉编译器 x表达式更有可能是真的,也就是有很大的几率是运行if分支的。

UNLIKELY 作用是告诉编译器 x表达式更有可能是假的,也就是有很大的几率是运行else分支的。

这样的好处是如果if-else分支预测正确时,可以大大提高程序运行的效率。


参考网址:https://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel-how-do-they-work-whats-their