怎么算 程序 CPU 执行时间

982 阅读5分钟

国庆了 本来今天要去 大姨那,下雨了 就没去。闲的在家 看看极客时间吧。

我最近不敢写掘金了,总感觉 写的东西 大家应该都知道,我希望能写一点 对大家有帮助的文章,而不是 水文,我写了很多备份稿子,但是 反而不知道怎么发了。

之前写了一篇 Rocketmq 的文章,本来感觉写法挺好的,但是反馈不是很好,搞得 我 不知道应不应该发了

《雨夜》 RocketMQ源码系列(一) NameServer 核心源码解析

最近想 重新学习下 计算机基础知识,看看有没有新的感悟

冯·诺依曼体系结构:计算机组成的金字塔

计算机的基本硬件组成

计算机的基本组成 必须的五个部分:控制器,处理器,存储单元,输入和输出设备

CPU、内存和主板,输入(Input)/ 输出(Output)设备,硬盘,显卡

主板的芯片组(Chipset)和总线(Bus)解决了 CPU 和内存之间如何通信的问题

作为外部 I/O 设备,它们是通过主板上的南桥(SouthBridge)芯片组,来控制和 CPU 之间的通信的。

冯·诺依曼体系结构

上面说的是 PC,手机呢?手机制造商们选择把 CPU、内存、网络通信,乃至摄像头芯片,都封装到一个芯片,然后再嵌入到手机主板上。这种方式叫 SoC,也就是 System on a Chip(系统芯片)

一台计算机应该有哪些部分组成

  1. 包含算术逻辑单元(Arithmetic Logic Unit,ALU)和处理器寄存器(Processor Register)的处理器单元(Processing Unit)
  2. 包含指令寄存器(Instruction Register)和程序计数器(Program Counter)的控制器单元(Control Unit/CU)
  3. 存储数据(Data)和指令(Instruction)的内存
  4. 各种输入和输出设备,以及对应的输入和输出机制

而所有的计算机程序,也都可以抽象为从输入设备读取输入信息,通过运算器和控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中。

image.png

计算机的基本组成

运算器、控制器、存储器、输入设备和输出设备这五大基本组件

计算机的指令和计算

CPU 的设计

CPU 时钟可以用来构造寄存器和内存的锁存器和触发器。数据通路,其实就是连接了整个运算器和控制器,并最终组成了 CPU。而出于对于性能和功耗的考虑,你要进一步理解和掌握面向流水线设计的 CPU、数据和控制冒险,以及分支预测的相关技术。

存储器的原理

计算机的计时单位:CPU 时钟

计算机可能同时运行着好多个程序,CPU 实际上不停地在各个程序之间进行切换。在这些走掉的时间里面,很可能 CPU 切换去运行别的程序了。而且,有些程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和 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测试 ,否则可能会导致 real time 可能会小于 user time+sys time


$ time seq 1000000 | wc -l
1000000


real  0m0.101s
user  0m0.031s
sys   0m0.016s

程序 CPU 执行时间的公式。

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

对于 CPU 时钟周期数,我们可以再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)”。不同的指令需要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在这样拆分了之后,我们的程序的 CPU 执行时间就可以变成这样三个部分的乘积。

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

  1. 时钟周期时间,就是计算机主频,这个取决于计算机硬件。我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。比如说,我最早使用的 80386 主频只有 33MHz,现在手头的笔记本电脑就有 2.8GHz,在主频层面,就提升了将近 100 倍。
  2. 每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle。在后面讲解 CPU 结构的时候,我们会看到,现代的 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。因此,对于 CPI 的优化,也是计算机组成和体系结构中的重要一环。
  3. 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。

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