简单问题藏着大陷阱
2016-04-11 18:28
260 查看
写一个函数计算当参数为n(n很大)时的值1-2+3-4+5-6+7....+n.
你可能会马上写出如下代码:
执行结果肯定没问题,但是当n很大时这个程序效率很低,尤其在嵌入式系统开发中,程序的运行效率很重要。
然后你可能改进了代码
仍然不够优化欧!
不要认为CPU运算速度快就把所有问题推给它做,我们应该将代码优化再优化。
不要忘了最后的测试工作!!
你可能会马上写出如下代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 long fn(long n) 4 { 5 long temp=0; 6 int i,flag=1; 7 if(n<=0) 8 { 9 printf("input error\n"); 10 exit(1); 11 } 12 for(i=1;i<=n;++i) 13 { 14 temp+=(flag*i); 15 flag=-1*flag; 16 } 17 return temp; 18 }但....
执行结果肯定没问题,但是当n很大时这个程序效率很低,尤其在嵌入式系统开发中,程序的运行效率很重要。
然后你可能改进了代码
19 long fn1(long n) 20 { 21 long temp=0; 22 int i=1,j=1,flag=1; 23 if(n<=0) 24 { 25 printf("input error\n"); 26 exit(1); 27 } 28 while(j<=n) 29 { 30 tmpe+=i; 31 i=-i; 32 i>0?i++:i--; 33 j++; 34 } 35 return temp; 36 }比起上一个程序,将所有涉及到乘法指令的语句改为执行加法语句,在运算时间上缩短了很多,而代价只是增加了一个整型变量。
仍然不够优化欧!
37 long fn2(long n) 38 { 39 if(n<=0) 40 { 41 printf("input error\n"); 42 exit(1); 43 } 44 if(0==n%2) 45 return (n/2)*(-1); 46 else 47 return (n/2)*(-1)+n; 48 49 }有没有很惊讶!!
不要认为CPU运算速度快就把所有问题推给它做,我们应该将代码优化再优化。
不要忘了最后的测试工作!!
50 int main() 51 { 52 printf("ret: %d %d %d\n",fn(100),fn1(100),fn2(100)); 53 return 0; 54 }
相关文章推荐
- MySQL 优化
- 书评:《算法之美( Algorithms to Live By )》
- Google排名优化的几个影响因素
- 动易2006序列号破解算法公布
- DB2优化(简易版)
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Asp编码优化技巧
- 如何监测和优化OLAP数据库
- mysql -参数thread_cache_size优化方法 小结
- 深入学习SQL Server聚合函数算法优化技巧
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题