请教高手,关于__builtin_expect的问题

lvp1984 2010-10-20 10:43:54
在内核代码中,经常会遇到
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
问几个问题:
1 !!(x)前为什么要加两次!!
2 gcc遇到__builtin_expect会优化什么? 优化的基本思路是什么?
3 用__builtin_expect优化后会有多少性能提升? 我的测试代码如下,我发现用__builtin_expect后没有明显的性能提升
int main() {
time_t t1 = time(NULL);
int xxx=0;
for(long i; i < 2000000000L; i++) {
if( likely( xxx == 0) ) {
xxx=i%1;
}
}
time_t t2 = time(NULL);
printf("xxx=%ld\n", xxx);
printf("time=%d\n", t2-t1);
}
每个问题20分, 先答对先得

...全文
742 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxiatuxr 2012-08-04
  • 打赏
  • 举报
回复
第一个问题补充一下:
!!是为了把表达式x转化成0或者1,因为x表达式是int型的,而第二个参数是bool型的
localxiao 2012-08-04
  • 打赏
  • 举报
回复
和分支有关的预测,主要是体现在cpu的predictor上

这个不是单单由编译器决定的,只是编译器尽量在汇编代码的组织上,让特定跳转更加有优势

另外,你要测分支预测的话,这样少的代码片段,基本能保证所有代码都在L1S上,编译器的工作,基本看不到效果,而且,循环次数那么大,而且,循环体内部又这样单调,cpu根本就不大可能会预测失败
sffkobe 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 watermelon258 的回复:]

第一个问题:应该是使变量变成一个真假变量(!!应该是非非得真的一个逻辑运算) 能以0或1来达到你的预判
第二个问题:__builtin_expect() 目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行化,以减少指令跳转带来的性能下降。
__builtin_expect((x),1) 表示 x 的值为真的可能性更大;
__builtin_expect((x),0) 表示 x……
[/Quote]
不错。
watermelon258 2012-02-21
  • 打赏
  • 举报
回复
第一个问题:应该是使变量变成一个真假变量(!!应该是非非得真的一个逻辑运算) 能以0或1来达到你的预判
第二个问题:__builtin_expect() 目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行化,以减少指令跳转带来的性能下降。
__builtin_expect((x),1) 表示 x 的值为真的可能性更大;
__builtin_expect((x),0) 表示 x 的值为假的可能性更大。
也就是说,使用 likely() ,执行 if 后面的语句的机会更大,使用unlikely(),执行else 后面的语句的机会更大。通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着起面的代码,从而减少指令跳转带来的性能上的下降。
第三个问题:其宏涵义在上面已经说过了,像你这函数的使用,其性能是没有多大改善的,因为你这个
if( likely( xxx == 0) ) {xxx=i%1;}
中xxx==0的可能性不大呀!大部分时间是不等于0的,你改为unlikely()性能会有改变.



lvp1984 2010-10-20
  • 打赏
  • 举报
回复
有没有人知道阿~~~
lvp1984 2010-10-20
  • 打赏
  • 举报
回复
自己顶上去

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧