性能分析

关注源代码或其汇编代码是一种发现性能问题的流行方法,但不最有效的方法。当性能达不到预期时,你可以使用一种统称为profiler的特殊程序分析工具更快地确定根本原因。

有许多不同类型的profiler。我倾向于通过类比物理学家或其他自然科学家如何研究小分子来探讨它们,即要根据所需的精度水平来选择正确的工具:

  • 当物体在微米尺度上时,他们使用光学显微镜。
  • 当物体在纳米尺度上,光不再与它们相互作用时,它们会使用电子显微镜。
  • 当物体更小时(例如,原子内部),他们会求助于关于事物如何运转的理论和假设(并使用复杂和间接的实验来验证这些假设)。

同样,我们有三种主要的profiling技术,每种技术有不同的原理,不同的适用领域,不同的精度水平:

  • 通过性能检测Instrumentation),你可以对整个程序或部分程序进行计时,并统计你感兴趣的特定事件。
  • 通过统计分析Statistical profiling),你可以深入到汇编级别,跟踪各种硬件事件(hardware events),如分支预测失误或缓存未命中,这些对性能至关重要。
  • 通过程序仿真Program simulation),你能够深入到单个时钟周期级别,并在CPU执行小的汇编片段时查看每个周期中CPU内部发生的事情。

实用算法设计也可以被视为一个经验领域。我们在很大程度上依赖于相同的实验方法,尽管这并不是因为我们不知道自然界的一些基本秘密,而是因为现代计算机太复杂了,难以分析——此外,由于硬件公司的IP保护,我们这些普通的软件工程师无法了解其中的一些细节(事实上,考虑到最准确的x86指令表是逆向工程得到的,我们有理由相信英特尔自己也并不知道这些细节)。

在本章中,我们将研究这三种关键的性能分析方法,以及一些经过时间考验的管理性能评估的计算实验的实践。