软件速度取决于算法
同样的事情,方法不一样,效果也不一样。比如,汽车引擎,可以让你的速度超越马车,却无法超越音速;涡轮引擎,可以轻松超越音速;却无法飞出地球;如超越音障,却无法飞出地球;如果有火箭发动机,就可以到达火星。
在软件设计过程中,有时我们只在乎有好的语法结构,有完美的注释,而往往不注重软件的优化,算法的科学,从而导致软件运行过程看似没有任何问题,可运行结果确走很多不必要的道路,往往在大的数据运算过程中,存在卡机,速度奇慢的现象。下面就此问题谈一谈我在项目中的优化:
代码的运算速度取决于以下几个方面:
- 算法本身的复杂度,比如 算法本身的复杂度,比如MPEG MPEG比 比 JPEG JPEG复杂,
- CPU自身的速度和设计架构
- CPU的总线带宽
- 您自己的代码的写法
本文主要介绍如何优化您自己的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秒
是不是通过代码优化后,结果大不相同,所以并不是所有最好理解的代码一定是好代码,这个例子还可以用两个查值表,结果还可以优化。