基准测试
基准测试通常涉及比较两个或多个执行相同任务的程序的性能。有时可能涉及比较两个或多个不同的程序,比如 Firefox vs Safari vs Chrome。有时则涉及比较同一个程序的不同版本。后一种情况可以让我们可靠地回答问题:“这个变动是否加快了速度?”
基准测试是一个复杂的主题,全面覆盖超出了本书的范围,但以下是基础知识。
首先,您需要工作负载来进行测量。理想情况下,您将拥有一系列能够代表程序实际使用情况的工作负载。使用真实世界的输入的工作负载最佳,但微基准测试和压力测试在适度使用时也可以有所帮助。
其次,您需要一种运行工作负载的方法,这也将决定所使用的度量标准。
- Rust 内置的基准测试是一个简单的起点,但它们使用不稳定的功能,因此只能在夜间版 Rust 上使用。
- Criterion和Divan是更复杂的替代方案。
- Hyperfine是一个出色的通用基准测试工具。
- 也可以使用自定义基准测试工具。例如,rustc-perf是用于对 Rust 编译器进行基准测试的工具。
在选择度量标准时,有许多选择,而正确的选择取决于正在进行基准测试的程序的性质。例如,对于批处理程序来说有意义的度量标准可能对于交互式程序来说没有意义。在许多情况下,墙上时间(wall-time)是一个显而易见的选择,因为它对应于用户的感知。然而,它可能受到很高的方差影响。特别是,内存布局的微小变化可能导致显著但短暂的性能波动。因此,其他方差较低的度量标准(如周期或指令计数)可能是一个合理的选择。
总结多个工作负载的测量结果也是一个挑战,有许多方法可以做到这一点,并没有单一的方法显然是最佳的。
良好的基准测试很难。话虽如此,在开始优化程序时,不要过分强调拥有完美的基准测试设置。一般的基准测试要比没有基准测试好得多。对您正在测量的内容保持开放的心态,随着时间的推移,您可以根据您对程序性能特征的了解进行基准测试改进。