序言
首先说明,本文中所要评估的计算机性能不是“系统性能”,而是指“CPU性能”。
系统性能的衡量,其实是指计算机的数据处理能力,它是一个与CPU处理速度、内存处理速度、硬盘读取速度和程序处理速度等多个因素相关的系统性能。可参考文章:http://blog.csdn.net/baidu_35692628/article/details/71364252
系统性能可以通过测量响应时间/吞吐率等方式得到,而要对这么多个因素进行定量比较是一个相当困难的工作。
这里逐步展开介绍如何评估“CPU性能”。
1. 计算机性能
性能评估是复杂的。
- 由于软件系统的规模及其复杂性,以及硬件设计和交互的复杂性。
性能标准多种多样。
有响应时间(执行时间),有吞吐率(带宽)等等,需求点不同,性能指标往往不同。
不过这些性能标准之间一般又是相互影响的,比如响应时间的减小意味着吞吐率的增大。
现假如有两种改进计算机系统的方式:[1] 处理器更换为更高速的型号。[2] 多核并行分别处理独立任务。
- 方法1:同时改进了响应时间和吞吐率。
- 方法2:只增加了吞吐率。不会使任务完成得更快。
以响应时间来讨论计算机性能。
- 为使性能最大化,我们希望任务响应时间/执行时间最小。
计算机性能比较简单举例。
[1] 如果将计算机性能表示如下
[2]那么如果计算机X性能比计算机Y好,有如下关系
[3] 定量表达计算机的性能差异,我们使用“X是Y的n倍快”的表达方式
举例:如果X运行一个程序需要10s,而Y需要15s,那么性能比为
[4] 性能和执行时间是一个倒数关系。要增加性能就需要降低执行时间。
2. 性能测量 = 系统性能 + CPU性能
执行时间相关术语
[1] wall clock time/response time/elapsed time:都指完成任务(执行完一段程序)所需的总时间。
即我之前文章中总结的real time
包括了硬盘访问、内存访问、I/O操作、操作系统开销等一切时间。
[2] CPU execution time:CPU执行时间,简称CPU时间。执行某一任务在CPU上所花费的时间。
user CPU time:即user time用户CPU时间。指在程序本身所花费的时间(用户空间)。
system CPU time:即sys time系统CPU时间。为执行程序而花在操作系统上的时间(内核空间)。
[3] clock cycle:时钟周期。
- 为计算机一个时钟周期的时间,通常是处理器时钟,一般为常数。
响应时间和CPU执行时间的区别:(即CPU time 和 real time)
real time:用户感受到的时间,响应时间,可能有多个进程混杂,很难区分开
CPU执行时间:包括用户CPU时间和系统CPU时间。即user time + sys time
确定了计算机性能测量标准。
使用”系统性能(system performance)”来表示空载系统响应时间
使用“CPU性能(CPU performance)”表示用户CPU时间
要改进一个程序的性能,必须明确性能的定义。
- 通过测量程序执行时间/响应时间/real time来寻找性能瓶颈。
3. CPU性能
一个程序的CPU执行时间
CPU执行时间=CPU时钟周期数×时钟周期时钟频率和时钟周期的倒数关系
时钟周期=1时钟频率以上两式表明,减小CPU时钟周期数 或 减小时钟周期(提高时钟频率),就能改进性能。但两者之间通常也是相互影响的。
性能改进计算举例:
某程序在一台时钟频率为2GHz的计算机A上运行需要10秒。现在将设计一台计算机B,希望将运行时间缩短为6秒。
计算机的设计者采用的方法是提高时钟频率,但这会影响CPU其余部分的设计,使计算机B运行该程序时需要相当于计算机A的1.2倍时钟周期数。
那么计算机设计者应该将时钟频率提高到多少?
计算机A:
10s=计算机A的CPU时钟周期数计算机A的时钟频率计算机B:
6s=1.2×计算机A的CPU时钟周期数计算机B的时钟频率两者相比,
计算机B的时钟频率计算机A的时钟频率=2得到,计算机B的时钟频率应为 4GHz.
CPU时钟周期与程序指令的关系
- 一个程序所需要的CPU时钟周期数可写为
- CPI = cycles per instruction,平均值
性能计算举例:
假设我们有相同指令集的两种不同实现方式。
计算机A的时钟周期为250ps,对某程序的CPI为2.0;
计算机B的时钟周期为500ps,对同样程序的CPI为1.2。
对于该程序,请问哪台计算机执行的速度更快?快多少?(假设程序指令数为N)
计算机A:
计算机A的CPU执行时间=N×CPIA×CPU时钟周期A=N×2.0×250ps=500N ps计算机B:
计算机B的CPU执行时间=N×CPIB×CPU时钟周期B=N×1.2×500ps=600N ps即,计算机A更快,为计算机B的1.2倍。
4. 经典的CPU性能公式
一个程序的CPU执行时间:该公式将性能分解为三个基本因素,我们可以用该公式来比较和评估不同方案。
CPU执行时间=指令数×CPI×时钟周期
CPU执行时间=指令数×CPI时钟频率时钟周期:计算机的说明书中通常介绍了时钟周期,难以测量的指令数和CPI。
指令数:由于指令数量取决于计算机体系结构,并不依赖于计算机的具体实现,因而我们可以在不知道计算机全部实现细节的情况下对指令数进行测量。
- 用仿真器等软件工具可以测量出指令数,也可以用现代处理器中的硬件计数器来测量执行的指令数、平均CPI和性能损失源等。
CPI:CPI与计算机的各种设计细节密切相关,包括存储系统和处理器结构,以及应用程序中不同类型的指令所占的比例。
- 因此,CPI对于不同应用程序是不同的,对于相同指令集的不同实现方式也是不同的。
- 因此,CPI对于不同应用程序是不同的,对于相同指令集的不同实现方式也是不同的。
计算机不同层次的性能测试指标及其测试单位
性能测试指标 | 性能测试单位 |
---|---|
程序的CPU执行时间 | 程序执行的秒数 |
指令数 | 程序执行的指令数 |
CPI | 每条指令的平均时钟周期数 |
时钟周期 | 每时钟周期的秒数 |
- 唯一能够被完全准确测量的计算机性能指标是时间。
5. 不同计算机CPU性能评估
经过上述章节分析,我们知道,当比较两台计算机性能时,必须考虑全部三个因素:时钟周期 + 指令数 + CPI.
以免造成对性能的误解。各种软硬件因素如何影响CPU性能(的各个因素):
软件或硬件指标 | 影响什么 | 如何影响 |
---|---|---|
程序算法 | 指令数,CPI | (1)算法决定源程序执行指令的数目,从而也决定了CPU执行指令的数目;(2)算法也可能通过使用较快或较慢的指令影响CPI。例如当算法采用更多的浮点运算时,将导致CPI增大。 |
编程语言 | 指令数,CPI | (1)编程语言的语句必须翻译为指令,从而决定了指令数;(2)编程语言也影响CPI。例如Java对数据抽象进行了大量支持,将进行间接调用,需要使用CPI较高的指令。 |
编译程序 | 指令数,CPI | 编译程序的效率,既影响指令数,又影响CPI。因为编译程序决定了最后生成的计算机指令,所以会以复杂的方式影响CPI。 |
指令集体系结构 | 指令数,CPI,时钟频率 | 指令集体系结构影响CPU性能的所有方面,因为它影响完成某功能所需的指令数、每条指令的周期数以及处理器的时钟频率 |
指令集架构ISA(即指令集体系结构)、汇编语言、处理器架构之间的关系:
[1] 汇编语言属于指令集,汇编语言使用人类看得懂的方式来描述指令集。指令集包括汇编语言形式和二进制机器码格式。
[2] 指令集决定了处理器架构一部分(解码逻辑和执行单元),处理器的架构就是用硬件电路实现指令集。
- 指令集架构规定了处理器如何识别这些汇编指令,以及如何与上层交互。
- 例如汇编语言:add r1,r2,r3的解码逻辑为r1 = r2 + r3还是r3 = r1 + r2
- 不同CPU有不同指令集,编译器无法为不同的CPU编译出相同的汇编指令。这也是为什么会有不同的编译器的原因
[3] 处理器识别了这些指令之后,如何执行这些指令就是处理器架构(微结构)的事情。
所以,在不同计算机性能比较时,我们必须首先确定影响CPU执行时间的三大因素以及每个因素的软硬件影响因素。基本上就是一个控制变量的过程,如果有太多因素不同,就不能直观地进行比较。
Acknowledgements:
http://book.51cto.com/art/201201/313562.htm
https://www.zhihu.com/question/23474438/answer/24733170
2017.09.02