【C++那些事】余数是%操作和用减法计算余数哪个快


缘由:

  测试了基础的判断分之后,对于取余的操作又产生了兴趣,那么取余和通过减法计算余数到底谁更快一些呢

  直接上代码:

#include <stdio.h>
#include <sys/time.h>
int main(int argc, char **argv){
    struct timeval start, end;
    int a = 45,b=10,c=0,d =4;
    const long long count = 100000000;
    gettimeofday(&start,NULL);
    for (long long i = 0; i < count; i++)
    {
        c = a%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("--%%    --cost:%d ms.\n",( endTime-beginTime));
    gettimeofday(&start,NULL);
    for (long long i = 0; i < count; i++)
    {
        c=a-b*d;
    }
    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;
}

直接上测试结果:

Linux结果:

  

Windows结果:

   

 结论:

  在使用1亿次的循环计算后,可以看出,取余操作符锁消耗的时间是使用- 和* 操作符混合处理的两倍,那么对于取余的操作来说,都可以使用减法与乘法的混合运算进行替代,至少不会比取余慢

   在无法使用-*快速替换时可以使用%操作符,作用就是增加了些损耗

底层实现 :

  对于汇编底层都是5条指令,其实指令没有缩减,减少的是实际预期除法指令的耗时

   

  

 

 那么问题来了

  如何通过减少汇编指令条数以达到加快处理除法和取余的操作呢,-> _ ->, 且听后续分解

  另外说一句:除法很慢,需要30多个时钟周期,移位运算需要个数时钟周期,效率提升很大 => 能移位用移位,不能移位用减法,不能减法用除法


免责声明!

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



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