第2 章 程 序 性 能

以下是本章中所介绍的有关程序性能分析与测量的概念:

• 确定一个程序对内存及时间的需求。

• 使用操作数和执行步数来测量一个程序的时间需求。

• 采用渐进符号描述复杂性,如 O、 、 、o 。

• 利用计时函数测量一个程序的实际运行时间。

除了上述概念以外,本章还给出了许多应用代码,在后续章节中将可以看到,这些代码有

很多用处。这些应用包括:

• 在一个数组中搜索具有指定特征的元素。本章中所使用的方法是顺序搜索和折半搜索。

• 对数组元素进行排序。本章给出了计数排序、选择排序、冒泡排序及插入排序的实现

代码。

• 采用Horner 法则计算一个多项式。

• 执行矩阵运算,如矩阵加、矩阵转置和矩阵乘。

2.1 引言

所谓程序性能( program performance ),是指运行一个程序所需要的内存大小和时间。

可以采用两种方法来确定一个程序的性能,一个是分析的方法,一个是实验的方法。在进行

性能分析( performance analysis )时,采用分析的方法,而在进行性能测量( p e r f o r m a n c e

m e a s u r e m e n t )时,借助于实验的方法。

程序的空间复杂性(space complexity )是指运行完一个程序所需要的内存大小。对一个程

序的空间复杂性感兴趣的主要原因如下:

• 如果程序将要运行在一个多用户计算机系统中,可能需要指明分配给该程序的内存大小。

• 对任何一个计算机系统,想提前知道是否有足够可用的内存来运行该程序。

• 一个问题可能有若干个内存需求各不相同的解决方案。比如,对于你的计算机来说,某

个C + +编译器仅需要 1 M B的空间,而另一个C + +编译器可能需要4 M B 的空间。如果你的计算机

中内存少于4 M B ,你只能选择1 M B的编译器。如果较小编译器的性能比得上较大的编译器,即

使用户的计算机中有额外的内存,也宁愿使用较小的编译器。

• 可以利用空间复杂性来估算一个程序所能解决的问题的最大规模。例如,有一个电路模

拟程序,用它模拟一个有 c个元件、w个连线的电路需要 2 8 0 K + 1 0 * (c+w )字节的内存。如果

可利用的内存总量为6 4 0 K字节,那么最大可以模拟c+w ≤3 6 K 的电路。

程序的时间复杂性(time complexity )是指运行完该程序所需要的时间。对一个程序的时

间复杂性感兴趣的主要原因如下:

• 有些计算机需要用户提供程序运行时间的上限,一旦达到这个上限,程序将被强制结束。

一种简易的办法是简单地指定时间上限为几千年。然而这种办法可能会造成严重的财政问题,

因为如果由于数据问题导致你的程序进入一个死循环,你可能需要为你所使用的机时付出巨额

资金。因此我们希望能提供一个稍大于所期望运行时间的时间上限。

第2章 程 序 性 能 3 1

下载

• 正在开发的程序可能需要提供一个满意的实时响应。例如,所有交互式程序都必须提

供实时响应。一个需要 1分钟才能把光标上移一页或下移一页的文本编辑器不可能被众多的

用户接受;一个电子表格程序需要花费几分钟才能对一个表单中的单元进行重新计值,那

么只有非常耐心的用户才会乐意使用它;如果一个数据库管理系统在对一个关系进行排序

时,用户可以有时间去喝两杯咖啡,那么它也很难被用户接受。为交互式应用所设计的程

序必须提供满意的实时响应。根据程序或程序模块的时间复杂性,可以决定其响应时间是

否可以接受,如果不能接受,要么重新设计正在使用的算法,要么为用户提供一台更快的

计算机。

• 如果有多种可选的方案来解决一个问题,那么具体决定采用哪一个主要基于这些方案之

间的性能差异。对于各种解决方案的时间及空间复杂性将采用加权的方式进行评价。

练习

1. 给出两种以上的原因说明为什么程序分析员对程序的空间复杂性感兴趣?

2. 给出两种以上的原因说明为什么程序分析员对程序的时间复杂