原创 程序可以这样飞起来

2010-1-21 20:51 2817 8 8 分类: 软件与OS

这几天在实验室收获良多,很迫切地想记录下来。


《感悟设计——电子设计的经验与哲理》希望专业相关的朋友们能看看这本书,我看过之后只能膜拜。差距啊…


接下来是看到现在个人总结并觉得震撼的地方。


1.能用定点运算的就绝不用浮点运算。尽管有的处理器里面带有浮点运算功能,频率也够高,所以让人觉不出什么不同,可为了提高运算速度,定点绝对比浮点来得更快。


2.能用移位的不用除法/乘法。有的处理器根本不能跑除法,所以只能用移位来近似。就算能进行除法运算也绝对比移位慢好几倍甚至好几十倍的速度。乘法也一样,而且为了让乘法器能更好的用在滤波器运算中,普通的运算还是不用它的为好。


3.查表与运算之间的选择。查表速度上比运算快,但资源较为浪费。相反,运算需要时间,内存资源则用的较少。


以上的我都还能想到,也觉得都很必要。后面的,打死我都不可能想得到……


首先比较下两段代码:


第一段,我觉得大多数人都会这么写,包括我也肯定是。这是一个将RGB的彩色数据转换成灰度值的其中一段代码。


int i;


for(i=0;i<IMGSIZE;i++)


{


        int r,g,b,y;


        r="D"[in.r]; g="E"[in.g]; b="F"[in.b];


        y="r"+g+b;


        out=y;


}


第二段。


int i;


for(i=0;i<IMGSIZE;i+=2)


{


        int r,g,b,y,r1,g1,b1,y1;


        r="D"[in.r]; g="E"[in.g]; b="F"[in.b];


        y="r"+g+b;


        out=y;


        r1=D[in[i+1].r]; g1=E[in[i+1].g]; b1=F[in[i+1].b];


        y1=r1+g1+b1;


        out[i+1]=y1;


}


乍眼一看,会觉得第二段代码写的是不是有问题啊?为什么第一段就已经可以完成的运算非要在循环体里面写两遍?这都是因为如今的32bitCPU都至少有两个ALU,而且都是并行的。所以,为了让两个ALU都运作起来,我们将程序设计成第二段的形式。这样的速度就提高了一倍!


不得不折服……不管是做一个硬件工程师也好,软件工程师也好,都必须对硬件架构和操作系统有很好的认识,不然只会成为一个程序员而已,而且还是个不够格的菜鸟程序员。

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条