posts - 107, comments - 1898, trackbacks - 6, articles - 0
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

《漫谈程序的效率和水平(二)》(2009/12/28)

Posted on 2009-12-30 09:00 n216 阅读(...) 评论(...) 编辑 收藏
 

上篇主要谈了提高程序效率要考虑满足用户的容忍度的问题,现在我们言归正传谈谈如何提高程序的效率问题。提高程序的效率涉及到计算机基础知识、涉及到编程经验、涉及到程序硬件环境和软件环境、涉及到资金成本和时间等各个方面。依我的经验提高程序效率要从以下几个方面入手:

一、             程序要简短

程序的效率本质是执行可执行代码(汇编指令)的次数。这一点是关键的关键,程序员一定要牢记心中。程序越简短,其可执行代码就越少,就越有效率(如果程序是串行操作的话)。因此,我们在编写过程化程序的时候,要尽量改进我们的算法,让语句最少,源程序语句减少可以导致可执行代码减少。

1) 不要编写一些不起作用的“废话”:例如,定义了不必要的变量,

2) 不要编写了不起作用的语句(有可能忘记注释掉的)。

3) 不要编写不可能出现各种例外的判断语句。

4) 不要编写能够一条语句能实现的功能非要用34条语句来实现。

5) 改进程序算法,改进算法其中最重要的一条,就是减少语句。

但是并不总是是程序短,时间就短。例如,我们可以编制3条导致死循环的语句。程序很短,但是时间确是很长。其根本原因就是虽然可执行代码行数很短,但是执行可执行代码次数是无穷的。

      记得在过去,有时候会把各自程序(相同功能)拿出来比一比,看谁的程序最短。那怕有一条语句的减少都是被认为很了不起。所以“惜墨如金”程序员必需时刻牢记。长此过往,程序员就会养成一个良好的习惯。

      我发现现在许多程序员,资源意识很淡漠,仿佛程序设计语言中所有资源都可以任意使用,不需付代价,不需要理由。这种挥霍性的编程是一个不好的习惯,它会严重影响程序的效率。

二、减少循环内操作

循环语句是影响程序效率最重要的原因之一,这里循环语句一个是指程序员自己编写的,另一个是指程序调用的函数中使用的循环语句。

1、 程序员编写的循环语句首先要尽可能减少循环次数,减少循环次数,可以减少程序运行时间。第二,尽量减少循环内无用的操作,能在循环外执行的语句,就在循环外执行,第三,尽量减少嵌套循环,因为循环中的循环是两循环次数相乘的关系。若有可能可以变嵌套循环为顺序循环,顺序循环是两循环次数相加。

2、 程序员要能知道自己调用的各种函数中可能出现的循环操作,通过参数,尽量避免循环次数的增加。例如查找子串函数,一定是包含循环操作的。程序员在使用这个函数的时候,一定要尽量减少被查找的字符串的长度,增加查找的字符串的长度。这样循环查找的次数就会减少。

三、充分利用内存

利用内存是提高程序效率的非常有效的方法,通过使用内存,我们可以缓存许多需要再加工的数据,无须进行I/O交换,这样就可以提高程序的效率了。另外,我们可以利用内存建立数据的索引,加快数据查询的速度,从而提高了程序效率。

四、减少I/O操作

很多情况下I/O操作是影响程序效率的最重要的原因,尤其是数据库大数据量操作更是明显。我们可以建立通过建立表分区、表索引的方式来提高数据操作效率,这些方法本质是都是通过减少I/O操作来获取操作效率的。

减少I/O操作有很多技巧和方法,但是无论哪种方法都是要把I/O操作减少到最低。

例如,我们要输出1000万条记录到一个文本文件。一般的做法是形成一条记录写一次文件。如果,我们能形成1000条记录后,写一次文件,那么我们只要写1万次就可以了(其实上写文件还是很复杂的,它跟系统写缓冲区大小和硬盘本身结构有关)。这样程序效率就会有很大的提高。

又例如,我们可以用低级文件打开放式代替流文件打开方式,这样效率会更快些。因为流处理最终还是要调用低级打开的。

五、提高调用效率

在程序中,我们大量地调用系统函数、调用自己写的函数、调用各种引用的函数。这些函数的运行时间我们是无法改变的。因此我们要提高程序效率,我们

1)可以考虑使用功能相同但是运行时间较短的函数。

2)我们还可以自己编写一些函数替代系统函数或引用的函数,因为自己编制的函数所考虑因素比较少,功能比较直接,不需要考虑很多例外情况,程序代码要比其他函数要少的多。

六、使用全程变量

全程变量的使用可以减少参数的传递所花费的时间。参数传递在可执行代码中是需要花上PUSH(压栈)和POP(出栈)时间的。

但是,我不提倡使用全程变量,如果使用全程变量不能大幅度提高效率的话,还不如不用。但是,如果能够大幅度提高效率的话,使用全程变量也不失一种方法。

 

当以上的努力还不能使得程序效率达到用户容忍度的时候,还可以从更高层面提高程序的效率:

一、提高硬件环境

    提高计算机的内存大小、提高CPU性能、提高I/O吞吐能力、提高网络吞吐能力等硬件性能都能够提高程序的运行效率。

二、选择更接近底层的程序设计语言

这个道理是不言而喻的。

三、采用多机分布并行处理

可以把处理内容进行多机、分布、并行处理,这样也可以大大提高程序效率。

以上方法会导致更高的企业成本,关键是企业要评估其性价比。

 

一般人认为程序效率高,程序的水平就高。但是,我们也看到为了提高效率,我们可能就会更多地使用全程变量,就会申请更多的内存,就有可能破坏程序的结构,这样程序的水平就会降低。一个好的程序不但外在要有好的效率,而且内在要有好的结构,要有最佳的内存效率比。高水平的程序一定是高效率的,但高效率程序并不总是高水平的。

   很多人会问还有没有其它提高程序效率的方法,我的回答是肯定的。例如我们可以在可执行程序中嵌入汇编程序,以提高程序的效率。但是,这不是常态的做法,程序员只要了解就行了。

   大部分程序员只会使用语言编写程序,但不知道这个源程序究竟是如何变成可执行代码、变成什么可执行代码,这些可执行代码的执行时间是长是短。因此,要从根本上提高程序的效率,需要程序员深懂源程序到可执行程序的过程,深懂编译原理、深懂汇编语言、深懂汇编中的系统调用。对于数据库而言,程序员要深懂数据库原理、深懂数据存放方式和数据查询方式,深懂数据库操作与I/O操作与内存的关系。而这些深懂是需要长时间编程积累的。这就是我为什么说程序效率的提高是无止尽的原因了。

这个话题内容太多,太细,我也无法深入去写,尤其是后半部分,写的匆忙,只能起抛砖引玉的作用了。

下篇:《大项目、小项目都是程序员成熟之道》