【学习】-C/C++各种计算速度汇总

本文使用环境:
主控: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、总结

其实只有在大量的计算情况下,时间才会有显著的区别,当然这不是说并没有用,在底层使用的时候,优先使用位移运算是有显著优势的。

猜你喜欢

转载自blog.csdn.net/qq_37280428/article/details/124831464