性能的指标

响应时间和 吞吐率

响应时间

性能 = 1/响应时间

吞吐率 在规定时间内可以做多少事

计算机的计时单位 CPU时钟

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

time命令。它会返回三个值,第一个是real time,也就是我们说的Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;第二个是user time,也就是CPU在运行你的程序,在用户态运行指令的时间;第三个是sys time,是CPU在运行你的程序,在操作系统内核里运行指令的时间。而程序实际花费的CPU执行时间(CPU Time),就是user time加上sys time。在我给的这个例子里,你可以看到,实际上程序用了0.101s,但是CPU time只有0.031+0.016 = 0.047s。运行程序的时间里,只有不到一半是实际花在这个程序上的。程序实际占用的CPU时间一般比Elapsed Time要少不少其次,即使我们已经拿到了CPU时间,

我们也不一定可以直接“比较”出两个程序的性能差异

程序的CPU执行时间=CPU时钟周期数×时钟周期时间

针对 cpu时钟周期数 我们也可以进行拆解

指令数 * 每条指令的平均时钟周期数 (CPI)

程序的CPU执行时间=指令数×CPI×Clock Cycle Time

如果我们想要解决性能问题,其实就是要优化这三者。

  1. 时钟周期时间,就是计算机主频,这个取决于计算机硬件。我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。比如说,我最早使用的80386主频只有33MHz,现在手头的笔记本电脑就有2.8GHz,在主频层面,就提升了将近100倍。

  2. 每条指令的平均时钟周期数CPI,就是一条指令到底需要多少CPU Cycle。在后面讲解CPU结构的时候,我们会看到,现代的CPU通过流水线技术(Pipeline),让一条指令需要的CPU Cycle尽可能地少。因此,对于CPI的优化,也是计算机组成和体系结构中的重要一环。

  3. 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式

自己想象成一个CPU,坐在那里写程序。计算机主频就好像是你的打字速度,打字越快,你自然可以多写一点程序。CPI相当于你在写程序的时候,熟悉各种快捷键,越是打同样的内容,需要敲击键盘的次数就越少。指令数相当于你的程序设计得够合理,同样的程序要写的代码行数就少。