IA_编程效率 没有意识到程序效率的编码者,可能会写如下的代码: for( i=0; i<1000; i++ ){ GetLocalHostName( hostname ); ... } GetLocalHostName的意思是取得当前计算机名。实际上取得一次机器的名字就可以,而把它放在循环体中,它就被调用了1000次,其中999次是多余的。 如果不意识到无效率行为的危害,程序中多次出现如此没有效率的行为,那么程序运行效率会非常慢,有时会慢得使用用户难以接受。程序效率程序效率,是用执行的步骤(step)数――时间复杂度、占内存的多少来衡量的――空间复杂度。完成某项工作,执行的步骤(step)的次数最少、占用内存最小是程序员所追求的。特别是嵌入式系统的开发,内存等资源都是有限的。因此,(1)效率改善的指导原则满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率;如果程序的正确性、可靠性得不到保证,提高效率就失去了根本;如果程序的健壮性得不到保证,提高效率就失去了目标;如果程序的可读性得不到保证,提高效率就失去了方向;以提高程序的全局效率为主,提高局部效率为辅;如何只从局部角度出发,局部效率的改善一般对全局效率改善作用不大,有时甚至影响全局效率的改善;应该从全局角度出发,整体考虑,作出统一改善的调整,有的时候局部利益为配合整体需要应作出牺牲;举例。(2)在优化程序的效率时,应当先找出限制效率的“瓶颈”;非关键点的改善,不会根本改变效率的现状;先进行一些基准数据测量和问题收集,寻找提高效率的关键点;有时一次关键的改动还不能解决问题,还需要进一步的数据测量和持续的改进,直到符合要求;先优化数据结构和算法,再优化执行代码;因为O(n2)的算法写不出O(nlog2n)的程序,因此写程序前应该考虑数据结构和算法的选择和优化;如果你已经选择了正确的算法,那么只有到了写程序的最后,才有可能去关心执行代码的优化问题;时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷;一般来讲,在空间允许的时候,我们会花费空间换取时间效率的大幅提升;当空间受限--时间效率和空间对立的时候,我们根据需要,在两者之间作出适当折中;(3)时间效率改善的考虑减少内存分配的次数一次能够申请的内存,就不要多次申请;被多次访问函数中存储“不变量”的变量请定义成为static。如: GetLocalHostName(char* name) { char ame[] = "GetLocalHostName"; sys_log( "%s begin......", ame ); ... sys_log( "%s end......", ame ); } 如果这是一个经常调用的函数,ame进行分配内存,这个开销很大啊。把这个变量声明成static吧,当函数再次被调用时,就会省去了分配内存的开销,执行效率也很好。提高循环体效率减少循环次数减少循环体内执行语句的数量例子参见《》(4)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数下面例子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();
IA 编程效率 来自淘豆网m.daumloan.com转载请标明出处.