Chinaunix首页 | 论坛 | 博客
  • 博客访问: 120595
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-31 11:07
个人简介

弃我去者,昨日之日不可留; 乱我心者,今日之日多烦忧。

文章分类

分类: C/C++

2014-07-25 09:10:27

这几天一直在看有关计算机系统方面的书,看到里面有关程序优化的一些章节有种被人点了一下的感觉,原谅本人以前对程序优化并没有去涉及,只是按照编码规范完成代码的单纯。现在看到这些觉得这将是后续编码应该注意的地方了。


举个书中的例子,简单讲就是一个实现基本功能的代码在一般的程序环境中并不一定需要优化,因为可能存在优化后的程序性能还会有所降低。但这也仅限在特定的环境下,即这里优化不优化存在一个临界点,一定超过这个点,就需要优化了。

下面的两段代码,sum1是优化前的代码,sum2是优化后的代码:

  1. void sum1(int a[], int b[], int n)
  2. {
  3.     int i;
  4.     
  5.     b[0]=a[0];
  6.  
  7.     for(i=1;i<n;i++){
  8.         b[i] = b[i-1]+a[i];
  9.     }
  10.     return;
  11. }

  12. void sum2(int a[],int b[], int n)
  13. {
  14.     int i;
  15.     
  16.     b[0]=a[0];

  17.     for(i=1; i<n-1; i+=2) {
  18.          int mid=a[i]+b[i-1];
  19.          b[i]=mid;
  20.          b[i+1]=mid+a[i+1];
  21.     }

  22.     if(i<n){
  23.          b[i]=a[i]+b[i-1];
  24.     }
  25.     return;
  26. }
上面两端程序的执行时间我们可以近似的表示为:

sum1 = T_1 + X_1 * n;
sum2  = T_2 + X_2 * n;

T_1 < T_2  (T_1 小于 T_2是由于单个循环中sum2会比sum1多处更多的中间操作)
X_1 > X_2  (X_1 大于 X_2则是因为循环次数决定的)

直接用一个常数来直观表示(可能不准确)

sum1 = 480 + 10 * n;
sum2  = 500 + 6 * n;

在这里我们可以看到
1.当n < 5的时候sum1的执行时间还是小于sum2的,即此时可以不用优化
2.当n > 5的时候sum1的执行时间就大于sum2的,即此时需要优化。


所以在编码过程中,我们需要注意优化,但是是根据自身环境做出的优化,不能盲目的优化,只有优化真正能带来实际效益的时候才选择。

PS:这里的T值和X值大都是根据多次的实测得到的,可能也可以直接用工具来计算。这些值是关键。

阅读(675) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~