深入浅出计算机组成原理学习笔记-02

Posted Try Try Try

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出计算机组成原理学习笔记-02相关的知识,希望对你有一定的参考价值。

通过你的CPU主频,我们来谈谈“性能”究竟是什么?

1.什么是性能?时间的倒数

计算机的性能,其实和我们干体力劳动很像,好比是我们要搬东西。对于计算机的性能,我们需要有个

标准来衡量。这个标准中主要有两个指标。

第一个是响应时间(Response time)或者叫执行时间(Execution time)。想要提升响应时间这个性

能指标,你可以理解为让计算机“跑得更快”。

第二个是吞吐率(Throughput)或者带宽(Bandwidth),想要提升这个指标,你可以理解为让计算

机“搬得更多”。

所以说,响应时间指的就是,我们执行一个程序,到底需要花多少时间。花的时间越少,自然性能就越

好。

而吞吐率是指我们在一定的时间范围内,到底能处理多少事情。这里的“事情”,在计算机里就是处理的

数据或者执行的程序指令。

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

性能 = 1/ 响应时间

所以,响应时间越短,性能的数值就越大。

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

虽然时间是一个很自然的用来衡量性能的指标,但是用时间来衡量时,有两个问题。

  1. 时间不“准”,如果用你自己随便写的一个程序,来统计程序运行的时间,每一次统计结果不会完全一样。有

    可能这一次花了 45ms,下一次变成了 53ms。

    为什么会不准呢?这里面有好几个原因。首先,我们统计时间是用类似于“掐秒表”一样,记录程序运行结束

    的时间减去程序开始运行的时间。这个时间也叫 Wall Clock Time 或者 Elapsed Time,就是在运行程序期

    间,挂在墙上的钟走掉的时间。

    但是,计算机可能同时运行着好多个程序,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

    time seq 1000000 | wc -l
    1000000
    
    real	0m0.019s
    user	0m0.015s
    sys	0m0.003s
    
    

    在这个例子中,实际程序执行用了0.015s,但是CPU time只有0.015+0.003=0.018s。

  2. 即使我们已经拿到了 CPU 时间,我们也不一定可以直接“比较”出两个程序的性能差异。即使在同一台计算机

    上,CPU 可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。

    除了 CPU 之外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。所以,我们需要对“时

    间”这个我们可以感知的指标进行拆解,把程序的 CPU 执行时间变成 CPU 时钟周期数(CPU Cycles)和 时

    钟周期时间(Clock Cycle)的乘积。

    程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间
    时钟周期时间= 1/电脑的主频

    最简单的提升性能方案,自然缩短时钟周期时间,也就是提升主频。换句话说,就是换一块好一点的 CPU。

    不过,这个是我们这些软件工程师控制不了的事情,所以我们就把目光挪到了乘法的另一个因子——CPU 时

    钟周期数上。如果能够减少程序需要的 CPU 时钟周期数量,一样能够提升程序性能。

    对于 CPU 时钟周期数,我们可以再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per

    Instruction,简称 CPI)”。不同的指令需要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,但是

    乘法需要的 Cycles 就比加法要多,自然也就慢。在这样拆分了之后,我们的程序的 CPU 执行时间就可以变

    成这样三个部分的乘积。

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

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

    1. 时钟周期时间,可以提高计算机主频。

    2. 每条指令的平均时钟周期数,就是一条指令到底需要多少CPU cycle。现代的 CPU 通过流水线技术

      (Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。

    3. 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译

      器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。

3.总结

性能主要取决于响应时间与吞吐率这两个指标,吞吐率可以通过增加硬件的配置来提升,响应时间可以通过提高计算机的主频、降低指令数、降低每条指令的CPI来降低。

本篇笔记是观看极客时间专栏《深入浅出计算机组成原理》后加上自己的理解编写。文章如有错误之处请告知在下,谢谢。

以上是关于深入浅出计算机组成原理学习笔记-02的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出计算机组成原理

笔记整理——深入理解JVM原理

计算机组成原理学习笔记

计算机组成原理王道中央处理器学习笔记

计算机组成原理学习笔记

深入浅出计算机组成原理:通过你的CPU主频,我们来谈谈“性能”究竟是什么?(第3讲)