c语言中级教程+编程效率-17

上传人:j7****6 文档编号:61812459 上传时间:2018-12-13 格式:PPT 页数:23 大小:77KB
返回 下载 相关 举报
c语言中级教程+编程效率-17_第1页
第1页 / 共23页
c语言中级教程+编程效率-17_第2页
第2页 / 共23页
c语言中级教程+编程效率-17_第3页
第3页 / 共23页
c语言中级教程+编程效率-17_第4页
第4页 / 共23页
c语言中级教程+编程效率-17_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《c语言中级教程+编程效率-17》由会员分享,可在线阅读,更多相关《c语言中级教程+编程效率-17(23页珍藏版)》请在金锄头文库上搜索。

1、C语言中级培训,十一、编程效率,关于程序效率(1),没有意识到程序效率的编码者,可能会写如下的代码: for( i=0; i1000; i+ ) GetLocalHostName( hostname ); . GetLocalHostName的意思是取得当前计算机名。实际上取得一次机器的名字就可以,而把它放在循环体中,它就被调用了1000次,有999次是多余的。 如果没有意识到无效率行为的危害,程序中多次出现如此效率低下的行为,那么程序运行会非常慢,有时会慢得使用户难以接受。,区分老手和新手的试金石:,求n! .,张嘴就喊简单的人肯定是新手。,老手首先会问这n可能会多大? 然后会提出几种解决方

2、案,如函数法、静态变量法、迭代法、递归法等,并且评估各自的复杂度和优缺点。 最后确定一种方案。 仅仅能写出代码来的人不是真正的程序员,编程对程序员的要求是很高的。,关于程序效率(2),程序效率 程序效率,是用执行的步骤(step)数(时间复杂度)、占内存的多少(空间复杂度)来衡量的。 完成某项工作,执行的步骤(step)的次数最少、占用内存最小是程序员所追求的。特别是嵌入式系统的开发,内存等资源都是有限的。 因此,提高效率的着眼点应该是: 减少执行次数 减少占用空间,如何提高程序效率(1),效率改善的指导原则: 在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率; 如果

3、程序的正确性、可靠性得不到保证,提高效率就失去了根本; 如果程序的健壮性得不到保证,提高效率就失去了目标; 如果程序的可读性得不到保证,提高效率就失去了方向;,如何提高程序效率(2),以提高程序的全局效率为主,提高局部效率为辅; 如果只从局部角度出发,局部效率的改善一般对全局效率改善作用不大,有时甚至影响全局效率的改善; 应该从全局角度出发,整体考虑,作出统一改善的调整,有的时候局部利益为配合整体需要应作出牺牲;,如何提高程序效率(3),在优化程序的效率时,应当先找出限制效率的“瓶颈”关键点: 非关键点的改善,不会根本改变效率的现状; 先进行一些基准数据测量和问题收集,寻找提高效率的关键点;

4、有时一次关键的改动还不能解决问题,还需要进一步的数据测量和持续的改进,直到符合要求;,如何提高程序效率(4),先优化数据结构和算法,再优化执行代码; 因为O(n2)的算法写不出O(nlog2n)的程序,因此写程序前应该考虑数据结构和算法的选择和优化; 如果你已经选择了正确的算法,那么到了写程序时,才有可能去关心执行代码的优化问题;,如何提高程序效率(5),时间效率和空间效率可能对立,此时应当分析、权衡哪个更重要,作出适当的折中; 一般来讲,在空间允许的时候,我们会花费空间换取时间效率的大幅提升; 在时间效率和空间对立的时候,我们应根据需要,在两者之间作出适当折中;,如何提高程序效率(6),时间

5、效率改善的措施减少内存分配的次数 一次能够申请的内存,就不要多次申请; 函数中的存储会被多次访问 ,“相对不变量”的变量请定义成为static。如: GetLocalHostName(char* name) char funcName = “GetLocalHostName“; sys_log( “%s begin“, funcName ); . sys_log( “%s end“, funcName ); 如果这是一个经常调用的函数,每次调用时都要对funcName分配内存,这个开销很大。把这个变量声明成static,当函数再次被调用时,就会省去了分配内存的开销,执行效率很好。,如何提高程序

6、效率(7),时间效率改善的措施 提高循环体效率 减少循环次数 减少循环体内执行语句的数量 例子参见1.1 关于程序效率序中的例子,如何提高程序效率(8),在多重循环中,如果有可能,应当将长的循环放在最内层,短的循环放在最外层,以减少CPU 跨切循环层的次数。下例a和b的功能一样,但效率不同: 例a: for (i=0; i5;i+) /5次切换 for (j=0; j100; j+) Dothing(); 例b: for (j=0; j100;j+) /100次切换 for (i=0; i5; i+) Dothing(); ,如何提高程序效率(9),减少指针定位 指针(-)使用很方便,但实际运

7、行往往需要进行地址计算;不必要的地址计算会导致性能下降; 尽可能减少-的多级嵌套。,如何提高程序效率(10),提高数学表达式的效率 a*b + a*c = a*(b+c); 减少一次乘法,但不改变表达式的意义。 b/a + c/a = (1/a)*(b+c); 把两次除法变成一次除法和一次乘法,在几乎所有的平台上,除法都比乘法慢。 (a | b ) 当c为假时,前一个表达式要计算( a | b ),后个表达式则不计算。,如何提高程序效率(11),空间效率改善的考虑 合理定义结构体成员顺序:按照类型从小到大,相同类型连续存放。 如: AA_t和BB_t所占用的空间是不同的:,typedef st

8、ruct short a; int b; short c; AA_t;,typedef struct short a; short c; int b; BB_t;,如何提高程序效率(12),冗余数据压缩,可以减少对内存的占用 如有些矩阵数据的存储。有些矩阵中的非零元素很少,可以考虑通过只存储非零数据来减少对存储空间的占用。 动态内存使用的方式,可以提高内存的利用率。 追求空间的效率和追求时间的效率,往往是矛盾的,需要全面权衡,不可偏废。,如何提高程序效率(13),减少代码的行数可以减少ROM的占用 对于嵌入系统而言,ROM资源是很宝贵的。减少代码行数是减少ROM占用量的有效途径; 减少代码行的

9、方法: 消除冗余代码,可以有效减少代码行数 通过函数指针和函数表,可以减少程序代码规模,实例(1),效率改善的例 A: 请看下面的代码: for( int i = 0; i back-surf-bitsi= value; 如下修改是否更好 将3层指针变为数组名: unsigned char *b_s_b =context-back-surf-bits; for( int i = 0; i back-surf-bits; for(;b_s_b numPixels; b_s_b+) *b_s_b = value;,实例(2),效率改善的例B 有一组函数:functionA, functionB,

10、functionZ,它们分别是对26种不同状态(A,B,Z)的处理。它们的函数形式如下: int functionA(int event); int functionB(int event); . int functionZ(int event); 下面代码对,但效率不高,是新手的代码。 switch (status) case A: functionA(event);break; case B: functionB(event);break; case Z: functionZ(event);break; ,实例(3),缺陷是:生成目标代码体积大,且可维护性弱。可以这样来解决: typdef

11、 int (*pFunc)(int event); / pFunc 是 int (*)(int event)的别名 typedef enum A =0,B, ,Z Status_t; pFunc functionlistZ+1 = functionA, functionB, ,functionZ ; /指向函数名串的指针数组 Status_t status; /然后 status被赋值 functionliststatus(event); 这么做是不是更好?这是老手的代码。,第二部分 问题与习题,问题表(1),Q1:请问(i)比 (ii)哪个效率高? (i) if (condition) for ( i=0; i N; i +) DoSomething(); else for ( i=0; i N; i +) DoOtherthing(); (ii) for ( i=0; i N; i +) if (condition) DoSomething(); else DoOtherthing();,问题表(2),Q2:改善下面这段程序 int f( long n ) int i, s; for (s = 0, i = 1;i= n; i+) s += i; return( s ); ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号