缘由:
测试了基础的判断分之后,对于取余的操作又产生了兴趣,那么取余和通过减法计算余数到底谁更快一些呢
直接上代码:
#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多个时钟周期,移位运算需要个数时钟周期,效率提升很大 => 能移位用移位,不能移位用减法,不能减法用除法