1 什么是性能?
计算机性能的标准主要有两个指标:响应时间(Response time)和 吞吐率(Throughput)。
一般把性能,定义成响应时间的倒数,也就是:性能 = 1 / 响应时间
2 计算机的计时单位:CPU 时钟
时间是用来衡量性能的指标,用时间来衡量时,有两个问题。
2.1 时间不“准”
时间不“准”,原因统计时间是用类似于“掐秒表”一样,记录程序运行结束的时间减去程序开始运行的时间。这个时间也叫 Wall Clock Time 或者 Elapsed Time。计算机可能同时运行着好多个程序,CPU 实际上不停地在各个程序之间进行切换。Linux 下解决办法是用 time 的命令统计,同样的 Wall Clock Time 下,程序实际在 CPU 上到底花了多少时间。time 命令会返回三个值,第一个是 real time,也就是运行程序整个过程中流逝掉的时间(Wall Clock Time);第二个是 user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间;第三个是 sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。而程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time。
注意:在多 CPU 的机器上,命令可能分配到不同的 CPU 上,我们拿到的 user time 和 sys time 是两个 CPU 上花费的时间之和,可能会导致 real time 可能会小于 user time+sys time。
2.2 拿到了 CPU 时间,我们也不一定可以直接“比较”出两个程序的性能差异
即使在同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。
把程序的 CPU 执行时间变成 CPU 时钟周期数(CPU Cycles)和 时钟周期时间(Clock Cycle)的乘积。
程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间
时钟周期时间:如电脑CPU主频 Intel Core-i7-7700HQ 2.8GHz,这里的 2.8GHz 就是电脑的主频(Frequency/Clock Rate)。可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条。如果想要更准确一点描述,这个 2.8GHz 就代表,我们 CPU 的一个“钟表”能够识别出来的最小的时间间隔。
CPU 时钟周期数:把它变成“指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)”。不同的指令需要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在这样拆分了之后,我们的程序的 CPU 执行时间就可以变成这样三个部分的乘积。
程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time
此文章为 2 月Day4学习笔记,内容来源于 极客时间《深入浅出计算机组成原理》。