让你的软件速度飞起来

软件速度取决于算法
同样的事情,方法不一样,效果也不一样。比如,汽车引擎,可以让你的速度超越马车,却无法超越音速;涡轮引擎,可以轻松超越音速;却无法飞出地球;如超越音障,却无法飞出地球;如果有火箭发动机,就可以到达火星。
在软件设计过程中,有时我们只在乎有好的语法结构,有完美的注释,而往往不注重软件的优化,算法的科学,从而导致软件运行过程看似没有任何问题,可运行结果确走很多不必要的道路,往往在大的数据运算过程中,存在卡机,速度奇慢的现象。下面就此问题谈一谈我在项目中的优化:

代码的运算速度取决于以下几个方面:

  1. 算法本身的复杂度,比如 算法本身的复杂度,比如MPEG MPEG比 比 JPEG JPEG复杂,
  2. CPU自身的速度和设计架构
  3. CPU的总线带宽
  4. 您自己的代码的写法

本文主要介绍如何优化您自己的code,实现软件的加速

将彩色图片转为算法图片为例:
原始图
原始图
计算图
计算图

第一次无BUG程序结果:

#define XSIZE 640 
#define YSIZE 480 
#define IMGSIZE XSIZE*YSIZE 
typedef struct RGB { 
	unsigned char R; 
	unsigned char G; 
	unsigned char B; 
}RGB; 
struct RGB in[IMGSIZE];
unsigned char out[IMGSIZE];
//需要计算的原始数据 //计算后的结果
//Y = 0.299 * R + 0.587 * G + 0.114 * B;
void calc_bitmap() 
{ 
	for (int i = 0; i<IMGSIZE; i++) 
	{ 
		double r, g, b, y; 
		unsigned char yy; 
		r = in[i].R;  
		g = in[i].G; 
		b = in[i].B; 
		y = 0.299*r + 0.587*g + 0.114*b; 
		yy = y; 
		out[i] = yy; 
	} 
}

此段代码在电脑与STM32F103RBT6平台运行结果如下:
PC机(WIN10 ,i7 8核,8G内存) : 2800ms
STM32F103 : 120s
由于存在硬件浮点处理器,CPU 频率也够高,计算速度快,但也用了2.8秒,但STM32 ,没有以上2个 优势,浮点操作被编译器分解成了整数运算,运算速度为120秒左右运算速度太可怕.

代码优化:
(1)、去掉浮点运算
y = 0.299r + 0.587g + 0.114*b
改为:
Y =( 299 * r + 587 * g + 114 * b)/1000;
如果改成除以4096,R,G,B 的因数同比放大4.096倍取整,如(299 * 4.096 * R)/4096,更好,如果有是在STM32上是有必要,但在PC机上就算了,毕竟现在电脑有浮点数计算能力。
(2)、RGB的取值有文章可做, RGB的取值永远都大于等于0,小于等于255,我们能不能将它都预先计算出来,用查表法来确定其值。

优化结果代码:

#define XSIZE 640 
#define YSIZE 480 
#define IMGSIZE XSIZE*YSIZE 
typedef struct RGB { 
	unsigned char R; 
	unsigned char G; 
	unsigned char B; 
}RGB; 
struct RGB in[IMGSIZE];
unsigned char out[IMGSIZE];
int D[256], E[256], F[256];//查表数组 
void table_init() 
{
	for(int i=0;i<256;i++) 
	{
		D[i]=int(i*299);  
		D[i]=D[i]/1000; 
		E[i] = i * 587;
		E[i]=E[i]/1000; 
		F[i] = i * 114;
		F[i]=F[i]/1000; 
	} 
}
void calc_bimap_2() 
{
	for (int i = 0; i<IMGSIZE; i++) 
	{
		int r, g, b, y; 
		r = D[in[i].R];  
		g = E[in[i].G]; 
		b = F[in[i].B];  //查表 
		y=r+g+b; 
		out[i]=y; 
	} 
}

结果:
电脑运行 82ms
STM32平台 : 1.6秒

是不是通过代码优化后,结果大不相同,所以并不是所有最好理解的代码一定是好代码,这个例子还可以用两个查值表,结果还可以优化。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值