c语言中级编程实例,《C语言中级教程 编程效率-17》.ppt

《C语言中级教程 编程效率-17》.ppt

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值