时间的倒数

性能的标准有两个指标:

第一个是响应时间(Response time)或者叫执行时间(Execution time)。想要提升响应时间这个性能指标,你可以理解为让计算机“跑得更快”。响应时间指的就是,我们执行一个程序,到底需要花多少时间。花的时间越少,自然性能就越好。

第二个是吞吐率(Throughput)或者带宽(Bandwidth),想要提升这个指标,你可以理解为让计算机“搬得更多”。吞吐率是指我们在一定的时间范围内,到底能处理多少事情。这里的“事情”,在计算机里就是处理的数据或者执行的程序指令。

我们一般把性能,定义成响应时间的倒数,也就是:

CPU 主频与性能 - 图1

计时单位:CPU 时钟

用时间来衡量性能有两个问题:

首先是时间不准,程序每次运行的时间都可能不同,因为计算机可能同时运行着好多个程序,CPU 实际上不停地在各个程序之间进行切换。在这些走掉的时间里面,很可能 CPU 切换去运行别的程序了。而且,有些程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和 CPU。所以说,要想准确统计某个程序运行时间,进而去比较两个程序的实际性能,我们得把这些时间给刨除掉。

  1. [root@nfs ~]# time seq 1000000 | wc -l
  2. 1000000
  3. real 0m0.058s 整个运行时间
  4. user 0m0.047s CPU 用户态运行指令的时间
  5. sys 0m0.044s CPU 内核里运行指令的时间
  6. 因为在一台多核或者多 cpu 的机器上运行,seq wc 命令会分配到两个 cpu 上,user sys 是两个 cpu 时间相加的,而 real 只是现实时钟里走过的时间,极端情况下 user+sys 可以到达 real 的两倍。

0b340db019d7e389a2bde4c237ee4700.webp
其次,即使我们已经拿到了 CPU 时间,我们也不一定可以直接“比较”出两个程序的性能差异。即使在同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。

除了 CPU 之外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。所以,我们需要对“时间”这个我们可以感知的指标进行拆解,把程序的 CPU 执行时间变成 CPU 时钟周期数(CPU Cycles)和 时钟周期时间(Clock Cycle)的乘积。

CPU 主频与性能 - 图3

CPU 主频与性能 - 图4

CPU 主频决定于硬件,所以程序员将提升的重点放到 CPU 执行数量上。对于 CPU 时钟周期数,我们可以再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)

CPU 主频与性能 - 图5

时钟周期:取决于计算机硬件,CPU 主频。

CPI:平局一条指令需要多少个时钟周期,与 CPU 结构有关。

指令数:程序执行多少指令,用哪些指令,与编译器有关,同样的的代码在不同编译器下有不同的表示方式。