用 CPI 火焰图分析 Linux 性能问题

1. 什么是 CPI ?

本小节讲述为何使用 CPI 分析程序性能的意义。若是已经很是了解 CPI 对分析程序性能的意义,能够跳过本小节的阅读。算法

1.1 程序怎么样才能跑得快 ?

理解什么是 CPI,首先让咱们思考一个问题:在一个给定的处理器上,如何才能让程序跑得更快呢?性能

假设程序跑得快慢的标准是程序的执行时间,那么程序执行的快慢,就能够用以下公式来表示:优化

程序执行时间 = 程序总指令数 x 每 CPU 时钟周期时间 x 每指令执行所需平均时钟周期数

所以,要想程序跑得快,即减小程序执行时间,咱们就须要在如下三个方面下功夫:spa

  1. 减小程序总指令数scala

    要减小程序执行的总指令数,可能有如下手段:设计

    • 算法优化;好的算法设计,可能带来更少的指令执行数
    • 更高效的编译器或者解释器;新的编译器或者解释器,可能对一样的源代码,生成更少的机器码。
    • 用更底层的语言优化;这是为什么 Linux 内核代码使用 C 语言,而且还喜欢内联汇编。
    • 更新的处理器指令;新的处理器指令,对处理某类特殊目的运算更有帮助,而新版本编译器最重要的工做就是,在新的处理器上,用最新的高效指令;例如,x86 SSE,AVX 指令。
  2. 减小每 CPU 时钟周期时间

    这一点很容易理解,缩短 CPU 时钟周期的时间,实际上就是要提升 CPU 的主频。这正是 Intel 过去占无不胜的法宝之一。今天,因为主频的提升已经到了制造工艺的极限,CPU 时钟周期的时间很难再继续下降了。code

  3. 减小每指令执行所需平均时钟周期数ip

    如何减小每指令执行所需平均 CPU 时钟周期数呢?让咱们先从 CPU 设计角度看一下:编译器

    • 标量处理器 (Scalar Processor) ;一个 CPU 时钟周期只能执行一条指令;
    • 超标量处理器 (Superscalar Processor);一个 CPU 时钟周期能够执行多条指令;一般这个是靠在处理器里实现多级流水线 (Pipeline) 来实现的。

    所以不难看出,若是使用支持超标量处理器的 CPU,利用 CPU 流水线提升指令并行度,那么就能够达到咱们的目的了。流水线的并行度越高,执行效率越高,那么每指令执行所需平均时钟周期数就会越低。编译

相关文章
相关标签/搜索