- 衡量性能的指标有什么?
- 针对CPU执行时间,我们可以从哪些部分优化?
衡量性能的指标:
- 响应时间。执行一个程序需要花费多少时间。
- 带宽(也称为吞吐率)。在一定时间内,能处理多少事情。
这里我们主要讨论的是响应时间。
一般情况下,我们把性能定义为时间的倒数,性能 = 1/响应时间
,这时候我们就要用时间衡量性能的指标,这时候就需要统计程序的运行时间。
通常我们计算一个程序的运行时间都是在程序开始的时候记录一个时间,程序运行结束的时候记录一个时间, 最后两者求差值。
但是这个计算方式是有一些问题的,假设计算机同时运行着多个程序,那么CPU实际上是在不停的在各个程序之间进行切换。这我们计算的这个时间内,CPU可能切换到其他程序上面。运行程序还涉及到从硬盘网络等途径读取数据。要准备的统计某个程序运行时间,比较两个程序的实际性能,我们要把这些时间刨除掉。
即使我们可以通过系统操作命令,获取程序在CPU上实际花费的时间,也就是程序的CPU运行时间。
但是这时候还有一些不可控的因素,那就是CPU的变化呀,众所周知,现在不同的CPU的主频是不同的,就好比摩托车和自行车的速度是不一样的。同一块的CPU运行同一个程序,也不能保证每次运行的状态都是一样的,满载和降频的情况下,运行程序花费的时间肯定也是不一样的。就像明天就要交作业的你和半个月后要交作业的你,这状态肯定不一样的。
那么此时此刻,我们就需要一个更小的单位,表示CPU运行时间,而且能体现出来不同状态的CPU工作情况。这就是就引入了一个新的东西:CPU时钟。
此时的程序CPU执行时间就表示为下面的公式:
$$ 程序的CPU执行时间 = CPU时钟周期数\times时钟周期时间 $$
时钟周期时间可以理解为CPU的最小时间间隔,CPU的最小时间间隔又与主频相关,主频可以理解为CPU在一秒时间内,可以执行的简单指令数量。那么时钟周期时间=1/主频。这就好像我们用钟表计时的时候,秒针跑完一圈花费一分钟,秒针走了60次,最小时间间隔是一秒。
时钟周期数可以理解为程序运行时需要多少CPU的时间间隔,程序又可以分解为一条条的指令,然后我们就可以吧时钟周期数分解为“指令数x每条指令的平均时钟周期数(Cycles Per Instruction,简称CPI)”,需要注意一点,不同的指令需要的时钟周期数是不一样的。
这时候CPU执行时间就可以变成这样三个部分的乘积:
$$ 程序的CPU执行时间=指令数 \times CPI \times Clock Cycle Time $$
那么,现在再看怎么提升性能,就很简单了,只要针对这三部分做调整:
- 时钟周期时间,可以通过提升CPU的主频缩短时钟周期时间,但是提升主频后会增大热量,带来散热的问题,会降低CPU的稳定性。
- 每条指令的平均时钟周期数CPI,就是一条指令到底需要多少CPU Cycle。我们要尽可能减少每一条指令需要的CPU Cycle。
- 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候是编译器做优化。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。