zoukankan      html  css  js  c++  java
  • 【计算机组成原理】03-性能究竟是什么

      我们日常使用电脑和编程时,都经常提到“性能”这个词。“性能”到底指什么,能否进行准确定义,从而量化比较呢?

      在计算机组成原理乃至体系结构中,“性能”都是最重要的一个主题。学习和研究计算机组成原理,就是在理解计算机是如何运作的,为什么要这样运作。很多时候,“为什么这样做”的原因就是为了提升“性能”。

    1. 什么是性能

    1.1 衡量计算机性能的指标

      计算机性能的衡量标准中,主要有两个指标:

    1.1.1 响应时间(Response Time),亦称执行时间(Execution time)

      响应时间指的是,执行一个程序,要花多长时间。花的时间越少,性能自然也越好。

      提升响应时间,就是让计算机跑得更快。

    1.1.2 吞吐率(Throughput),或带宽(Bandwidth)

      吞吐率指的是,在一定时间范围内,能处理多少事情(处理数据、执行程序指令)。

      提升吞吐率,就是让计算机搬得更多。

    1.2 如何提升这两个衡量指标

      如果响应时间短,在相同时间内就能多处理一些请求。所以,缩短程序的响应时间,通常会提升吞吐率。

      除了缩短响应时间,还可以通过并行的方式来提升吞吐率,譬如现在的8核、16核处理器。

      提升吞吐率的办法有很多,通常只要堆硬件、加机器就能实现。但响应时间的提升则没那么容易——CPU的性能发展已经遇到瓶颈了。

    1.3 性能的定义

      我们通常把性能定义为响应时间的倒数,即:

    性能 = 1 / 响应时间

      由此,响应时间越短,性能的数值越大。譬如:同样一个程序,在 Coffee Lake 上,仅需 30s 即可运行完成。在 Sandy Bridge 上,需要 1min 才能完成。那么我们说 Coffee Lake 的性能是 1/30,Sandy Bridge 的性能是 1/60,它们的性能比为 2。于是我们可以说,Coffee Lake 的性能是 Sandy Bridge 的 2 倍。

      前些年流行的手机跑分软件,就是在手机上运行预设程序,根据所需时间计算分数,评估手机性能。在业界,各大 CPU 和服务器厂商组织了一个叫做 SPEC(Standard Performance Evaluation Corporation)的第三方机构,用于指定各种跑分规则。SPEC 提供的 CPU 基准测试程序,通过数十个不同的计算程序,给出 CPU 性能的最终评分。这些程序涵盖了方方面面的应用场景,有编译器、解释器、视频压缩、人工智能国际象棋等等。想了解更多,请戳

    测试

    一份 SPEC 报告通常包含了大量不同测试的评分

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

    2.1 为什么不直接用时间来衡量?

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

    2.1.1 时间不“准”

      我们自己写个程序,记录程序开始运行的时间和程序停止运行的时间(这个时间叫做 Wall Clock Time 或 Elapsed Time),计算其差值,会发现每次的结果都不尽相同。其原因有很多。

      首先,计算机中同时运行这很多程序,CPU 不停地在各程序之间进行切换。在这段时间差内,CPU 很可能被切换去运行其他程序了。

      其次,程序运行时,可能要从网络、硬盘读取数据,才能给到内存和 CPU,这也是耗时操作。

      综上,想准确统计某个程序的运行时间,进而比较实际性能,就要把这些时间刨除掉。Linux 下的 time 命令,就可以帮我们统计出来,程序实际在 CPU 上花了多少时间。运行 time 命令,会返回三个数值。第一个是 real time,即我们说的 Wall Clock Time。第二个是 user time,即 CPU 运行程序时,用户态所占时间。第三个是 sys time,即 CPU 运行程序时,内核态所占时间。程序实际的 CPU 执行时间(CPU Time),就是 user time 与 sys time 之和。

    1 $ time seq 1000000 | wc -l
    2 1000000
    3 
    4 
    5 real  0m0.101s
    6 user  0m0.031s
    7 sys   0m0.016s

      不难看出,Wall Clock Time 为 0.101s,CPU time 为 0.047s。

    2.1.2 拿到 CPU 时间,也未必能直接比较出性能差异

      即使在同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。此外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。

    2.2 更合理的衡量指标

      我们将“时间”这个指标拆解如下:

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

    2.2.1 什么是时钟周期时间

      CPU 都有主频这个参数。譬如 i7-7700HQ 的主频是 2.8GHz。主频代表 CPU 能识别出来的最小时间间隔。在 CPU 内部,有一个晶振。晶振的每一次“滴答”,就是时钟周期时间。对于 i7-7700HQ 而言,时钟周期时间就是 1/2.8G。所谓“超频”,其实就是把这个时钟周期调快了。

    2.2.2 CPU 时钟周期数

      从上述公式可知,提升主频即可缩短时钟周期时间,从而提升性能。但硬件的发展是有瓶颈的,这就要从另一个因子,即 CPU 时钟周期数入手。如果能减少程序所需的 CPU 时钟周期数,也能提升性能。

      进一步拆解 CPU 时钟周期数:

    CPU 时钟周期数 = 指令数 × 每条指令的平均时钟周期数(Cycles Per Instruction,CPI)

      不同的指令需要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在这样拆分了之后,我们的程序的 CPU 执行时间就可以变成这样三个部分的乘积:

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

    2.3 解决性能问题

      综上所述,解决性能问题,其实就是优化这三个因子。

    2.3.1 时钟周期时间

      时钟周期时间,取决于计算机的硬件主频。

    2.3.2 CPI

      每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle。现代的 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。

    2.3.3 指令数

      执行我们的程序到底需要多少条指令、具体用哪些指令,这主要由编译器决定。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。

  • 相关阅读:
    AQS笔记二 ---- 使用AQS自定义锁
    AQS笔记一 --- 源码分析
    ElasticSearch(二十一)正排和倒排索引
    ElasticSearch(二十)定位不合法的搜索及其原因
    ElasticSearch(十八)初识分词器
    ElasticSearch(十七)初识倒排索引
    还在用 kill -9 停机?这才是最优雅的姿势(转)
    一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
    你真的理解零拷贝了吗?(转)
    关于分布式事务的读书笔记
  • 原文地址:https://www.cnblogs.com/murongmochen/p/14083573.html
Copyright © 2011-2022 走看看