本文使用环境:
主控:arm-a53
编译环境:g++
开发板:
这是目录
写在前面:
这篇文章仅仅只为学习。记录不同的优化和不用的循环方式,对时间的影响。
一、数组和指针循环计算
1、数组的乘法
long long sum = 0;
char mmm[num] = {0};
char ttt[num] = {0};
void test1()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += mmm[i] * ttt[i];
}
}
2、指针的乘法
char mm[num] = {0};
char tt[num] = {0};
char *m = mm;
char *t = tt;
void test2()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += *m * *t;
m++;
t++;
}
}
3、指针内的乘法
char mmmm[num] = {0};
char tttt[num] = {0};
char *mmmmm = mmmm;
char *ttttt = tttt;
void test3()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += *mmmmm++ * *ttttt++;
}
}
4、主函数
#include <stdio.h>
#include <cstring>
#include <time.h>
#define num 10000000
int main()
{
clock_t start, end;
memset(mm,22,num);
memset(tt,22,num);
memset(mmm,22,num);
memset(ttt,22,num);
memset(mmmm,22,num);
memset(tttt,22,num);
start = clock();
test1();
end = clock();
double seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%lld \n",sum);
start = clock();
test2();
end = clock();
seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%lld \n",sum);
start = clock();
test3();
end = clock();
seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%lld \n",sum);
}
二、不同优化时间
1、不优化
2、-O1 不优化
3、-O2 不优化
4、-O3 不优化
得出的结论就是要做 -O3 的优化,就用数组。
三、乘除余计算时间
注意:以下所有的计算都必须是2^n倍数
1、乘法时间
1.1、*乘法计算
void test1()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mmm[i] * tt[i]);
}
}
1.2、左移计算
void test2()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mm[i] << 6);
}
}
1.3、主函数
#include <stdio.h>
#include <cstring>
#include <time.h>
#define num 10000000
long long sum = 0;
char mmm[num] = {0};
char tt[num] = {0};
void test1()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mmm[i] * tt[i]);
}
}
char mm[num] = {0};
void test2()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mm[i] << 6);
}
}
int main()
{
clock_t start, end;
memset(mm,64,num);
memset(mmm,64,num);
memset(tt,64,num);
start = clock();
test1();
end = clock();
double seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%lld \n",sum);
start = clock();
test2();
end = clock();
seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%lld \n",sum);
}
1.4、不同优化等级下乘法计算时间对比
2、除法时间
3.1、直接做除法
void test1()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mmm[i] / tt[i]);
}
}
3.2、右移除法
void test2()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mm[i] >> 6);
}
}
3.3、主函数
#include <stdio.h>
#include <cstring>
#include <time.h>
#define num 10000000
long long sum = 0;
char mmm[num] = {0};
char tt[num] = {0};
void test1()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mmm[i] / tt[i]);
}
}
char mm[num] = {0};
void test2()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mm[i] >> 6);
}
}
int main()
{
clock_t start, end;
memset(mm,64,num);
memset(mmm,64,num);
memset(tt,64,num);
start = clock();
test1();
end = clock();
double seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%lld \n",sum);
start = clock();
test2();
end = clock();
seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%lld \n",sum);
}
3.4、不同优化等级下除法计算时间对比
3、取余
3.1、直接取余
void test1()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += mmm[i] % tt[i];
}
}
3.2、&取余
void test2()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += mm[i] & (tt[i] - 1);
}
}
3.3、主函数
#include <stdio.h>
#include <cstring>
#include <time.h>
#define num 10000000
float sum = 0;
char mmm[num] = {0};
char tt[num] = {0};
void test1()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mmm[i] % tt[i]);
}
}
char mm[num] = {0};
void test2()
{
sum = 0;
for(int i=0;i<num;i++)
{
sum += (mm[i] & (tt[i] - 1));
}
}
int main()
{
clock_t start, end;
memset(mm,64,num);
memset(mmm,64,num);
memset(tt,64,num);
start = clock();
test1();
end = clock();
double seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%f \n",sum);
start = clock();
test2();
end = clock();
seconds =(double)(end - start)/CLOCKS_PER_SEC;
printf("Use1 time is: %.10f\n", seconds*1000);
printf("%f \n",sum);
}
3.4、不同优化等级下取余计算时间对比
4、总结
其实只有在大量的计算情况下,时间才会有显著的区别,当然这不是说并没有用,在底层使用的时候,优先使用位移运算是有显著优势的。
本文含有隐藏内容,请 开通VIP 后查看