什么是性能

对计算机的性能进行评价是一项富有挑战性的工作。由于现代软件系统的规模及其复杂度,以及硬件设计者采用了大量先进方法来改进性能,因此性能评价变得更为困难。
在不同的计算机中挑选合适的产品时,性能是重要的因素之一。因此,理解怎样才能最好地测量性能以及这些测量的局限性,对于选择1台计算机是非常重要的。
在这里,我们介绍性能评价的不同方法,然后分别从计算机用户和设计者的角度描述性能测量的度量标准,最后分析这些度量标准之间的内在关联,并提出经典的处理器性能方程式。

性能的定义

当我们说一台计算机的性能优于另一台计算机时,究竟意味着什么?在这里,我们需要先对性能进行定义。根据性能指标的不同,评价的结果也不同。
如果在2台不同的桌面计算机上运行同1个程序,那么首先完成作业的那台计算机显然更快。但如果运行的是1个数据中心(有多台服务器同时运行多个用户提交的作业),那你也许会说在一天之内完成作业最多的那台计算机更快。
因此,个人计算机用户希望降低响应时间(response time),又称执行时间(execution time),它表示1个任务从开始执行到完成的总时间。而数据中心的管理员感兴趣的是增加吞吐量(throughput)和带宽(bandwidth),即单位时间内完成的工作量。
对此,在评价性能时,对于关注响应时间的个人移动设备和关注吞吐率的服务器,需要使用不同的性能指标和基准测试程度。

响应时间:也称为执行时间,是计算机完成一项任务所需的总时间,包括磁盘访问、内存访问、I/O操作、操作系统开销以及CPU执行时间等。
吞吐率:也叫带宽,1种度量性能的参数,表示单位时间内完成的任务量。

例如,增加多个处理器分别处理独立的任务,如搜索万维网,一般情况不能让单个任务完成得更快,但是可以增加吞吐率。而如果将计算机的处理器更换为更高速的型号,那么在减少响应时间的同时一般也可以增加吞吐率。
而当需要处理的任务量达到吞吐率上限时,系统会要求请求的任务排队等待。此时,我们增加多个处理器分别处理独立的任务的方式,提高吞吐率的同时也减少了响应时间。因此,在实际的计算机系统中,响应时间和吞吐率往往是相互影响的。
而在讨论计算机性能时,我们暂时只考虑响应时间。为了使性能最大化,我们希望任务的响应时间或执行时间最小,对于某个计算机X,响应时间和执行时间可以表达为:

$$
性能{x} = \frac{1}{执行时间{x}}
$$

如果有2台计算X和Y,X比Y性能更好,则有

$$
\frac{1}{执行时间{x}} \gt \frac{1}{执行时间{Y}}
$$。

也就是说,如果X比Y快,那么Y的执行时间比X长。
在讨论计算机设计时,经常要定量地比较计算机的性能,通常说X的速度是Y的n倍或X是Y的n倍快,即:

$$
\frac{性能{X}}{性能{Y}} = n
$$

如果X比Y快n倍,那么Y上的执行时间是X上执行时间的n倍。
简单而言,当我们试图对计算机进行量化比较时,通常采用术语比什么快。因为性能和执行时间是倒数关系,所以提高性能就需要减少执行时间。而为了避免使用术语增加和减少时造成混淆,当我们想说增加性能和减少执行时间时,通常用改进性能或者改进执行执行时间来表示。

性能的度量

时间常用来度量计算机性能。完成同样的任务时,所需时间最少的计算机是最快的。而程序的执行时间一般以秒为单位,然而当我们采用的计量方式不同时,时间也有不同的定义方法。对时间最直接的定义是墙钟时间(也叫响应时间或消逝时间)。这些术语均表示完成一项任务所需的总时间,包括磁盘访问、内存访问、I/O操作和操作系统开销等一切时间。
有时候,计算机经常被多个用户共享,因此1个处理器可能需要同时运行几个程序。在这种情况下,系统可能更侧重于优化整个系统的吞吐率,而不是最小化1个程序的响应时间。因此,我们往往需要把任务执行时间与CPU工作时间区别开来。
我们使用CPU执行时间或简称CPU时间,表示CPU为完成某任务花费的计算时间,不包括等待I/O或等待其他程序运行的时间。需要注意的是,用户所感受到的是程序的响应时间,而不是CPU时间。
CPU时间还可进一步分为用户程序执行所花费的CPU时间和操作系统为用户程序执行(操作系统服务)所花费的CPU时间,其中前者称为用户CPU时间,而后者称为系统CPU时间。这两者很难精确区分,因此通常难以分清哪些操作系统的活动是属于哪个用户程序的,而且不同操作系统的功能也千差万别。
不同的应用关注计算机系统性能的不同方面。许多应用,特别是运行在服务器上的应用,主要关注I/O性能,既依赖硬件又依赖软件,因此关注的是墙钟时间。而其他一些应用中,用户可能对吞吐率、响应时间或两者的组合更为关注。而要改进程序的性能,必须明确哪个性能指标是关键的,然后再对程序执行进行测量,寻找可能的性能瓶颈。

CPU的性能及其度量因素

用户和设计师经常以不同的指标来评价性能。如果我们能掌握这些不同指标之间的关系,就能确定设计中的变化对性能以及用户体验的影响。下面,我们通过1个简单的公式把最基本的几个CPU性能指标和CPU时间关联起来:

  
程序的CPU执行时间 = 程序的CPU时钟周期数 × 时钟周期长度  

该公式清楚地表明,硬件设计者可以通过减少程序执行时所需的CPU时钟周期数或减少时钟周期的长度来提高性能。

指令的性能

而上述公式并没有考虑程序执行所需的指令数。在编译器产生与程序对应的指令,然后计算机通过执行指令来运行程序,因此执行时间依赖于程序中的指令数。
1种考虑执行时间的方法是,执行时间等于执行的指令数乘以每条指令的平均执行时间,所以1个程序需要的时钟周期可以写成:

  
CPU时钟周期数 = 程序的指令数 × 每条指令的平均时钟周期数  

术语CPI(Clock cycles Per Instruction)表示执行每条指令所需的平均时钟周期数。不同的指令需要的时间可能不同,因此CPI是程序全部指令的平均值。因为1个程序的指令数是不变的,所以可以通过CPI来对相同指令集的不同实现方式进行比较。

经典的CPU性能公式

下面用指令数(instruction count)、CPI和时钟周期长度来表示基本性能公式:

  
CPU时间 = 指令数 × CPI × 时钟周期长度  

其中指令数表示某程序执行所需的指令数量。
由于时钟频率和时钟周期长度互为倒数,因此可以表示为:

$$
CPU时间 = \frac{指令数\times CPI}{时钟频率}
$$

这些公式把性能分解为3个关键因素。因此,如果我们知道某些实现或设计对这3个参数的影响,就可用这些公式对不同方案进行评估。
因此,我们有如下的公式:

$$
执行时间 = \frac{执行的秒数}{程度} = \frac{指令数}{程序} \times \frac{时钟周期数}{指令} \times \frac{秒}{时钟周期}
$$

那么,如何确定性能公式中这些因素的值呢?我们可以通过运行程序来测量CPU的执行时间,而时钟周期通常是1台计算机的固有属性,而在计算机的说明书中都会有明确说明。难以测量的是指令数和CPI。
当然,如果确定了时钟频率和CPU执行时间,我们只需要知道指令数或者CPI这两者之一,就可以依据性能公式计算出另一个。
通过用体系结构仿真器等软件工具分析程序的执行可以测量出指令数。此外,也可以通过很多处理器中自带的硬件计数器来测量执行的指令数、平均CPI和性能损失源等。但是,CPI与计算机的各种设计细节密切相关,包括存储系统和处理器结构以及应用程序中不同类型所占的比例。因此,不同的应用程序有不同的CPI,就像相同指令集有不同的实现方式一样。
可以看到,如果只用1种因素(如指令数)去评价性能是不合理的。在比较2台计算机时,形成执行时间的3个因素都应当考虑。如果某个因素相同,则性能由其他不同的因素决定。而程序的性能与算法、编程语言、编译器、体系结构以及实际的硬件有关。

结语

说了这么多,总算明白为什么编程时要调用time函数对程序进行测量了,原来也是对性能指标时间的1种评价,为了说明和查看程序性能是否比之前好的方式。

参考书籍:

《计算机组成与设计(硬件/软件接口)ARM版》P20-28

若文章对您有帮助,请打赏1块钱。您的支持,可以让我分享更多精彩的文章。转载请注明来源


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。