欢迎来到天天文库
浏览记录
ID:45400727
大小:77.00 KB
页数:23页
时间:2019-11-12
《C语言中级教程+编程效率-17》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C语言中级培训十一、编程效率关于程序效率(1)没有意识到程序效率的编码者,可能会写如下的代码:for( i=0; i<1000; i++ ) {GetLocalHostName( hostname ); ... }GetLocalHostName的意思是取得当前计算机名。实际上取得一次机器的名字就可以,而把它放在循环体中,它就被调用了1000次,有999次是多余的。如果没有意识到无效率行为的危害,程序中多次出现如此效率低下的行为,那么程序运行会非常慢,有时会慢得使用户难以接受。区分老手和新手的试
2、金石:求n!.张嘴就喊简单的人肯定是新手。老手首先会问这n可能会多大?然后会提出几种解决方案,如函数法、静态变量法、迭代法、递归法等,并且评估各自的复杂度和优缺点。最后确定一种方案。仅仅能写出代码来的人不是真正的程序员,编程对程序员的要求是很高的。关于程序效率(2)程序效率程序效率,是用执行的步骤(step)数(时间复杂度)、占内存的多少(空间复杂度)来衡量的。完成某项工作,执行的步骤(step)的次数最少、占用内存最小是程序员所追求的。特别是嵌入式系统的开发,内存等资源都是有限的。因此,提高效率的着眼点应该是:减少执行次数减少占用
3、空间如何提高程序效率(1)效率改善的指导原则:在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率;如果程序的正确性、可靠性得不到保证,提高效率就失去了根本;如果程序的健壮性得不到保证,提高效率就失去了目标;如果程序的可读性得不到保证,提高效率就失去了方向;如何提高程序效率(2)以提高程序的全局效率为主,提高局部效率为辅;如果只从局部角度出发,局部效率的改善一般对全局效率改善作用不大,有时甚至影响全局效率的改善;应该从全局角度出发,整体考虑,作出统一改善的调整,有的时候局部利益为配合整体需要应作出牺牲;如何提高
4、程序效率(3)在优化程序的效率时,应当先找出限制效率的“瓶颈”——关键点:非关键点的改善,不会根本改变效率的现状;先进行一些基准数据测量和问题收集,寻找提高效率的关键点;有时一次关键的改动还不能解决问题,还需要进一步的数据测量和持续的改进,直到符合要求;如何提高程序效率(4)先优化数据结构和算法,再优化执行代码;因为O(n2)的算法写不出O(nlog2n)的程序,因此写程序前应该考虑数据结构和算法的选择和优化;如果你已经选择了正确的算法,那么到了写程序时,才有可能去关心执行代码的优化问题;如何提高程序效率(5)时间效率和空间效率可能
5、对立,此时应当分析、权衡哪个更重要,作出适当的折中;一般来讲,在空间允许的时候,我们会花费空间换取时间效率的大幅提升;在时间效率和空间对立的时候,我们应根据需要,在两者之间作出适当折中;如何提高程序效率(6)时间效率改善的措施——减少内存分配的次数一次能够申请的内存,就不要多次申请;函数中的存储会被多次访问,“相对不变量”的变量请定义成为static。如:GetLocalHostName(char* name) { charfuncName[] = "GetLocalHostName";sys_log( "%s begi
6、n......",funcName); ...sys_log( "%s end......",funcName); }如果这是一个经常调用的函数,每次调用时都要对funcName分配内存,这个开销很大。把这个变量声明成static,当函数再次被调用时,就会省去了分配内存的开销,执行效率很好。如何提高程序效率(7)时间效率改善的措施提高循环体效率减少循环次数减少循环体内执行语句的数量例子参见《1.1关于程序效率》序中的例子如何提高程序效率(8)在多重循环中,如果有可能,应当将长的循环放在最内层,短的循环放在最外层,以减少C
7、PU跨切循环层的次数。下例a和b的功能一样,但效率不同:例a:for(i=0;i<5;i++)//5次切换{for(j=0;j<100;j++)Dothing();}例b:for(j=0;j<100;j++)//100次切换{for(i=0;i<5;i++)Dothing();}如何提高程序效率(9)减少指针定位指针(->)使用很方便,但实际运行往往需要进行地址计算;不必要的地址计算会导致性能下降;尽可能减少->的多级嵌套。如何提高程序效率(10)提高数学表达式的效率a*b+a*c==a*(b+c);减少一次乘法,但不改变表达式的意
8、义。b/a+c/a==(1/a)*(b+c);把两次除法变成一次除法和一次乘法,在几乎所有的平台上,除法都比乘法慢。(a
9、
10、b)&&c)==c&&(a
11、
12、b);当c为假时,前一个表达式要计算(a
13、
14、b),后个表达式则不计算。如何提高程
此文档下载收益归作者所有