版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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)charfuncName=GetLocalHostName; sys_log(%sbegin.,funcName);.sys_log(%send.,funcName);如果这是一个经常调用的函数,每次调用时都要对funcName分配内存,这个开销很大。把这个变量声明成static,当函数再次被调用时,就会省去了分配内存的开销,执行效率很好。 如何提高程序效率(7)时间效率改善的措施提高循环体效率减少循环次数减少循环体内执行语句的数量例子参见1.1 关于程序效率序中的例子如何提高程序效率(8
6、)在多重循环中,如果有可能,应当将长的循环放在最内层,短的循环放在最外层,以减少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; i)使用很方便,但实际运行往往需要进行地址计算;不必要的地址计算会导致性能下降;尽可能减少-的多级嵌套。如何提高程序效率(10)提高数学表达式的效率a*b + a*c = a*(b+c); 减少一次乘法,但不改变表达式的意义。b/a + c/a = (1/a)
7、*(b+c); 把两次除法变成一次除法和一次乘法,在几乎所有的平台上,除法都比乘法慢。(a | b ) & c ) = c & ( a | b ); 当c为假时,前一个表达式要计算( a | b ),后个表达式则不计算。如何提高程序效率(11)空间效率改善的考虑合理定义结构体成员顺序:按照类型从小到大,相同类型连续存放。如: AA_t和BB_t所占用的空间是不同的:typedef struct short a; int b; short c; AA_t;typedef struct short a; short c; int b;BB_t;如何提高程序效率(12)冗余数据压缩,可以减少对内存的
8、占用 如有些矩阵数据的存储。有些矩阵中的非零元素很少,可以考虑通过只存储非零数据来减少对存储空间的占用。动态内存使用的方式,可以提高内存的利用率。 追求空间的效率和追求时间的效率,往往是矛盾的,需要全面权衡,不可偏废。如何提高程序效率(13)减少代码的行数可以减少ROM的占用 对于嵌入系统而言,ROM资源是很宝贵的。减少代码行数是减少ROM占用量的有效途径;减少代码行的方法:消除冗余代码,可以有效减少代码行数通过函数指针和函数表,可以减少程序代码规模实例(1)效率改善的例 A:请看下面的代码: for( int i = 0; i back-surf-bitsi= value; 如下修改是否更好
9、 将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, functionZ,它们分别是对26种不同状态(A,B,Z)的处理。它们的函数形式如下: int functionA(int event); int functionB(int event); . int functionZ(int eve
10、nt);下面代码对,但效率不高,是新手的代码。 switch (status) case A: functionA(event);break; case B: functionB(event);break; case Z: functionZ(event);break; 实例(3)缺陷是:生成目标代码体积大,且可维护性弱。可以这样来解决: typdef 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()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 4 《地球-我们的家园》(教学实录)部编版道德与法治六年级下册
- 化妆合同范例 简易范例
- 开发项目技术合同范例
- 2025年马鞍山货运上岗证考试题库
- 大学商铺合同范例
- 无锡农村平房买卖合同范例
- 再生钢材采购合同范例
- 农村合伙购房合同范例
- 技术成果合同范例
- 汕头律师合同范例
- ISO45001管理体系培训课件
- 医院消防系统维护保养服务投标方案(图文版)(技术方案)
- 花都区2023-2024年-2024年八年级上学期语文期末试卷
- 2025年健康素养知识竞赛题库(含答案)
- 2024年物业管理师(中级四级)考试题库大全-下(判断、简答题)
- 2024年新疆区公务员录用考试《行测》试题及答案解析
- 人教版八年级英语上册第五单元教学设计(教案)
- 北师版2024春八下数学2.2不等式的基本性质【上课课件】
- 宗教签约合同模板
- 幼教老师合作协议书范本模板
- 2024年辽宁省锦州市财力保障中心招聘9人历年高频难、易错点500题模拟试题附带答案详解
评论
0/150
提交评论