[原创]Blackfin ADSP开发过程中的一点心得
0赞
发表于 6/26/2012 5:42:21 PM
阅读(3084)
今天在开发Blackfin ADSP时,遇到一个小程序,我研究了很久,给我了很大的启发,在这把这个问题写出来。
看这样一个程序
for( i=0; i<1000; i++ ){
GetLocalHostName( hostname );
...
}
GetLocalHostName( hostname );
...
}
实际上在图像处理中循环的地方有很多,GetLocalHostName在这的意思是取得当前计算机名。实际上取得一次机器的名字就可以,而把它放在循环体中,它就被调用了1000次,其中999次是多余的。
如果不意识到无效率行为的危害,程序中多次出现如此没有效率的行为,那么程序运行效率会非常慢,有时会慢得使用用户难以接受。
程序效率
–程序效率,是用执行的步骤(step)数――时间复杂度、占内存的多少来衡量的――空间复杂度。完成某项工作,执行的步骤(step)的次数最少、占用内存最小是程序员所追求的。特别是嵌入式系统的开发,内存等资源都是有限的。
因此,提高效率的着眼点应该是
•减少执行次数
•减少占用空间
效率改善的指导原则
–满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率;
•如果程序的正确性、可靠性得不到保证,提高效率就失去了根本;
•如果程序的健壮性得不到保证,提高效率就失去了目标;
•如果程序的可读性得不到保证,提高效率就失去了方向;
–以提高程序的全局效率为主,提高局部效率为辅;
•如何只从局部角度出发,局部效率的改善一般对全局效率改善作用不大,有时甚至影响全局效率的改善;
•应该从全局角度出发,整体考虑,作出统一改善的调整,有的时候局部利益为配合整体需要应作出牺牲;
比如:
下面例子a和例子b的功能一样,但效率不同
例a: for (i=0; i<5;i++)
{
for (j=0; j<100; j++)
{
{
Dothing();
}
}
例b: for (j=0; j<100;j++)
{
for (i=0; i<5; i++)
{
{
Dothing();
}
效率改善的例A
–请理解下面的代码
for( int i = 0; i < numPixels;i++ )
{
rendering_context->back_buffer->surface->bits[i] = some_value;
}
–做如下修改是否更好
unsigned char *back_surface_bits =
rendering_context->back_buffer->surface->bits;
for( int i = 0; i < numPixels; i++ )
{
back_surface_bits[i] = some_value;
}
–还可以进一步修改
unsigned char *back_surface_bits =
rendering_context->back_buffer->surface->bits;
for( int i = 0; i < numPixels;i++,back_surface_bits++ )
{
*back_surface_bits = some_value;
}
那么B程序又能不能改善呢,呵呵,我在想想。。。