緣由:
測試了基礎的判斷分之后,對於取余的操作又產生了興趣,那么取余和通過減法計算余數到底誰更快一些呢
直接上代碼:
#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多個時鍾周期,移位運算需要個數時鍾周期,效率提升很大 => 能移位用移位,不能移位用減法,不能減法用除法