1. 了解什么是性能优化
性能优化十分宽泛,但一般包含 CPU、内存、磁盘、网络等方面。
2. 了解性能优化中一些基础概念
2.1 了解 wall clock time, CPU time 和 off-CPU time
衡量程序性能最直接的标准就是程序的运行时间,但仅仅知道程序的运行时间很难指导我们如何把程序优化地更快,我们想要更进一步地了解这段时间之内到底发生了什么。
Linux 系统上的 time 命令能够告诉我们一些粗糙的信息,我们在命令行里输出下面的命令来测量检查某个文件的 CRC 校验码的运行时间:
time cksum <some_file>
以我的电脑(MacBook Pro 2018)为例,得到了以下输出:
8.22s user 1.06s system 96% cpu 9.618 total
#这段文字告诉了我们时间都花在了哪里:
#总时间 9.618s
#user 时间 8.22s,其含义就是 user CPU time(程序用户态调用时间)
#system 时间 1.06s,其含义就是 system CPU time(内核态调用时间)
user CPU time + system CPU time = 8.22s + 1.06s = 9.28s != total 9.618s
- 原因:
这是因为这条命令执行的时间内,程序并不是总是在 CPU 上执行,还有可能处于睡眠、等待等状态,比如等待文件从磁盘加载到内存等。这段时间既不算在 user CPU time 也不算在 system CPU time 内。 我们把程序在 CPU 上执行的时间(即 user CPU time + system CPU time)称为 CPU time(或 on-CPU time),程序处于睡眠等状态的时间称为 off-CPU time(or blocked time),程序实际运行的时间称为 wall clock time(字面意思是墙上时钟的时间,也就是真实世界中流逝的时间),对于一个给定的线程:wall clock time = CPU time + off-CPU time。
总结:
on-CPU time = user CPU time + system CPU time
off-CPU time = 程序处于睡眠等状态的时间
wall clock time(字面意思是墙上时钟的时间,也就是真实世界中流逝的时间)= 程序实际运行的时间 = CPU time + off-CPU time
- 通常在计算密集型(CPU intensive)的任务中 CPU time 会占据较大