博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#define likely(x) __builtin_expect(!!(x), 1) 性能测试
阅读量:4141 次
发布时间:2019-05-25

本文共 1454 字,大约阅读时间需要 4 分钟。

      看linux源码或者一些优秀组件的源码,经常碰到likely和unlikely,  其实很简单,无非就是显式告诉编译器怎么去优化。有兴趣的话,可以看看对应的汇编。下面,我们来实际测试一下likely/unlikely的性能优化效果:

#include 
#include
#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)#define N (1000 * 1000 * 1000)int64_t printTime(int64_t iT1) { struct timeval t2; gettimeofday(&t2, NULL); int64_t iT2 = t2.tv_sec * 1000000 + t2.tv_usec; int64_t gap = iT2 - iT1; printf("gap is %lld\n", gap); return t2.tv_sec * 1000000 + t2.tv_usec;}int fun1(){ int a = 0; for (int i = 0; i < N; i++) { if (i < 0) { a--; } else { a++; } } return a;}int fun2(){ int a = 0; for (int i = 0; i < N; i++) { if (i >= 0) { a++; } else { a--; } } return a;}int fun3() // 逻辑等价于fun1{ int a = 0; for (int i = 0; i < N; i++) { if (unlikely(i) < 0) { a--; } else { a++; } } return a;}int fun4() // 逻辑等价于fun2{ int a = 0; for (int i = 0; i < N; i++) { if (likely(i) >= 0) { a++; } else { a--; } } return a;}int main(){ struct timeval t; int64_t iT = 0; gettimeofday(&t, NULL); fun1(); iT = printTime(t.tv_sec * 1000000 + t.tv_usec); fun2(); iT = printTime(iT); fun3(); iT = printTime(iT); fun4(); iT = printTime(iT); return 0;}

         运行三次,结果:

taoge:~$ ./a.out            

gap is 2777564
gap is 2432064
gap is 1788922
gap is 1872011
taoge:~$ ./a.out 
gap is 2792285
gap is 2384819
gap is 1787595
gap is 1829156
taoge:~$ ./a.out 
gap is 2798899
gap is 2423693
gap is 1786800
gap is 1830484

 

      不多说。

    

转载地址:http://dfrvi.baihongyu.com/

你可能感兴趣的文章
pytorch(三)
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>