性能分析方法

当你在进行高级优化工作时,比如将更好的算法集成到应用程序中,通常很容易判断性能是否有所提高,因为基准测试结果很明显。大幅提速,如2倍、3倍等,从性能分析的角度来看相对容易。当你从程序中消除了大量计算时,你预期会在运行时间上看到明显的差异。

但也有一些情况下,你会看到执行时间的微小变化,比如5%,而你不知道这个变化是从哪里来的。仅仅依靠计时或吞吐量测量并不能解释性能是为什么提高或下降的。在这种情况下,我们需要进行性能分析,以了解我们观察到的减速或加速的潜在原因。

性能分析类似于侦探工作。要解决性能谜团,你需要收集尽可能多的数据,然后尝试形成一个假设。一旦假设被提出,你就设计一个实验来证明或反驳它。这可能需要多次来回,直到你找到线索。就像一个优秀的侦探一样,你会尽力收集尽可能多的证据来证实或反驳你的假设。一旦你有足够的线索,你就可以对你观察到的行为做出令人信服的解释。

当你刚开始处理性能问题时,你可能只有测量数据,比如在代码变更之前和之后的数据。基于这些测量数据,你得出结论:程序变慢了X个百分点。如果你知道减速发生在某次提交之后,这可能已经为你提供了足够的信息来修复问题。但如果你没有良好的参考点,那么减速的可能原因就是无穷无尽的,你需要收集更多的数据。收集这些数据的最流行方法之一是对应用程序进行性能分析并查看热点。本章介绍了这个方法以及其他一些在性能工程中被证明有效的方法。

接下来的问题是:“可用的性能数据有哪些,如何收集?”堆栈的硬件和软件层都有跟踪性能事件并记录它们的设施。在这个背景下,所谓的硬件是指执行程序的CPU,而软件是指操作系统、库、应用程序本身和用于分析的其他工具。通常,软件堆栈提供高级指标,如时间、上下文切换次数和页面错误,而CPU则监视缓存未命中、分支错误预测和其他与CPU相关的事件。根据你试图解决的问题,一些指标比其他指标更有用。因此,这并不意味着硬件指标总会给我们提供程序执行的更精确的概览。例如,一些指标,比如上下文切换次数,CPU 无法提供。性能分析工具,如Linux Perf,可以使用来自操作系统和CPU的数据。

正如你可能猜到的那样,性能工程师可能会使用数百种数据源。由于本书是关于CPU底层性能的,我们将重点介绍收集硬件级别信息的技术。我们将介绍一些最流行的性能分析技术:代码插桩化、跟踪、特性化、采样和屋顶线模型。我们还将讨论静态性能分析技术和不涉及运行实际应用程序的编译器优化报告。

results matching ""

    No results matching ""