【C++那些事】if和三母运算?:到底谁快的问题


缘由:

  在追求急速的处理过程中判断是必不可少的分支条件,那么存在三目运算符 A ?A:0这种取值 和if else 分支取值应该用哪个更好呢,那就取决于到底这两个语句之间有什么差异

  话不多说先上测试代码:代码很简单

linux:

#include <stdio.h>
#include <sys/time.h>
int main(int argc, char **argv){
    struct timeval start, end;
    int a = 1,b=2,c=0;
    const long long count = 10000000000;
    gettimeofday(&start,NULL);
    for (long long i = 0; i < count; i++)
    {
        if (a>b)
            c=a;
        else
            c=b;
    }
    gettimeofday(&end,NULL);
    long long beginTime = (long long)start.tv_sec * 1000 + (long long)start.tv_usec / 1000;
    long long endTime = (long long)end.tv_sec * 1000 + (long long)end.tv_usec / 1000;

    printf("--if--cost:%d ms.\n",( endTime-beginTime));
    gettimeofday(&start,NULL);
    for (long long i = 0; i < count; i++)
    {
        c=a>b?a:b;
    }
    gettimeofday(&end,NULL);
    beginTime = (long long)start.tv_sec * 1000 + (long long)start.tv_usec / 1000;
    endTime = (long long)end.tv_sec * 1000 + (long long)end.tv_usec / 1000;
    printf("--?:--cost:%d ms.\n",endTime-beginTime);
    return 0;
}

  在使用100亿次循环测试结果如下:

  

 

  Centos下测试效率基本相当,前后几次测试结果,两者效率近乎等价,毕竟100亿次的测试结果已经够说明问题了

windows:

  win下的同样执行100亿次的循环比较测试,多次测试后,结果如下:

  

   当windows的执行次数下降到1000W次时,结果如下

  

 

   三目运算符还稍微快一点

结论:

  在linux下if else 和三目运算符效率相当,

  在windows下if else的效率在100亿次的循环中强于三目运算符,但是在小于1亿次以下的循环是三目运算符快一点

底层实现:

  

 

   

 

   三目运算符需要10条汇编指令,if else 需要8条汇编指令,但是对于不同的系统编译出来的也有差异。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM