关键词搜索

源码搜索 ×
×

#define likely(x) __builtin_expect(!!(x), 1) 性能测试

发布2019-11-02浏览4082次

详情内容

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

  1. #include <stdio.h>
  2. #include<sys/time.h>
  3. #define likely(x) __builtin_expect(!!(x), 1)
  4. #define unlikely(x) __builtin_expect(!!(x), 0)
  5. #define N (1000 * 1000 * 1000)
  6. int64_t printTime(int64_t iT1)
  7. {
  8. struct timeval t2;
  9. gettimeofday(&t2, NULL);
  10. int64_t iT2 = t2.tv_sec * 1000000 + t2.tv_usec;
  11. int64_t gap = iT2 - iT1;
  12. printf("gap is %lld\n", gap);
  13. return t2.tv_sec * 1000000 + t2.tv_usec;
  14. }
  15. int fun1()
  16. {
  17. int a = 0;
  18. for (int i = 0; i < N; i++)
  19. {
  20. if (i < 0)
  21. {
  22. a--;
  23. }
  24. else
  25. {
  26. a++;
  27. }
  28. }
  29. return a;
  30. }
  31. int fun2()
  32. {
  33. int a = 0;
  34. for (int i = 0; i < N; i++)
  35. {
  36. if (i >= 0)
  37. {
  38. a++;
  39. }
  40. else
  41. {
  42. a--;
  43. }
  44. }
  45. return a;
  46. }
  47. int fun3() // 逻辑等价于fun1
  48. {
  49. int a = 0;
  50. for (int i = 0; i < N; i++)
  51. {
  52. if (unlikely(i) < 0)
  53. {
  54. a--;
  55. }
  56. else
  57. {
  58. a++;
  59. }
  60. }
  61. return a;
  62. }
  63. int fun4() // 逻辑等价于fun2
  64. {
  65. int a = 0;
  66. for (int i = 0; i < N; i++)
  67. {
  68. if (likely(i) >= 0)
  69. {
  70. a++;
  71. }
  72. else
  73. {
  74. a--;
  75. }
  76. }
  77. return a;
  78. }
  79. int main()
  80. {
  81. struct timeval t;
  82. int64_t iT = 0;
  83. gettimeofday(&t, NULL);
  84. fun1();
  85. iT = printTime(t.tv_sec * 1000000 + t.tv_usec);
  86. fun2();
  87. iT = printTime(iT);
  88. fun3();
  89. iT = printTime(iT);
  90. fun4();
  91. iT = printTime(iT);
  92. return 0;
  93. }

         运行三次,结果:

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

 

      不多说。

    

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载