【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