第一部分:在现代CPU上的性能分析
性能测量
了解应用程序性能的第一步是知道如何进行测量。人们将性能视为应用程序的特性之一。15 但与其他特性不同,性能不是一个布尔属性:一个应用程序可以非常慢,飞快,或者介于两者之间。这就是为什么对于是否具有性能的问题,不可能回答“是”或“否”的原因。
性能问题通常比大多数功能问题更难追踪和复现。尽管有时我们不得不处理非确定性的,难以复现的性能错误。通常,程序的每次运行在功能上都是相同的,但从性能的角度来看有些许差异。例如,解压缩zip文件时,我们一遍又一遍地获得相同的结果,这意味着这个操作是可重现的。然而,要精确复现此操作的每个CPU周期的性能特征是不可能的。
任何关心性能评估的人都知道有时进行公正的性能测量并从中得出准确的结论是多么困难。性能测量可能非常出乎意料和反直觉。更改源代码中看似无关的部分可能会让我们惊讶地发现对程序性能有重大影响。这种现象被称为测量偏差。由于测量中存在误差,性能分析需要使用统计方法来处理它们。这个主题值得一整本书来单独讨论。在这里,我们只关注高层次的思想和需要遵循的方向。
进行公平的性能实验是获得准确而有意义的结果的关键步骤。设计性能测试和配置环境都是评估性能过程中的重要组成部分。本章将简要介绍现代系统为何产生嘈杂的性能测量以及如何处理这种情况。我们将涉及在实际生产部署中测量性能的重要性。
没有一个长寿命的产品是不会发生性能退化的。这对于有许多贡献者的大型项目尤为重要,因为变化发生得非常迅速。本章将花几页讨论在持续集成和持续交付(CI/CD)系统中跟踪性能变化的自动化过程。我们还提供有关开发人员在源代码库中实施更改时如何正确收集和分析性能测量的一般指导。
本章的结尾描述了开发人员在基于时间的测量中可以使用的软件和硬件定时器,以及在设计和编写良好的微基准时可能遇到的常见问题。
15. Nelson Elhage的博客文章"Reflections on software performance": https://blog.nelhage.com/post/reflections-on-performance/。 ↩