主动基准测试

正如你在前几节中所见,测量性能是一项复杂的任务,沿途有许多陷阱。作为人类,我们倾向于欢迎有利的结果而忽视不利的结果。这经常导致基准测试以"运行后不管"的方式进行,没有任何额外分析,忽视任何潜在问题。以这种方式进行的测量很可能是不完整的、具有误导性的,甚至是错误的。考虑以下两个场景:

  • 开发者 A 在团队会议上说:"如果我们在整个 C++ 代码库的类声明中添加 final 关键字,代码会快 5%,部分测试显示加速高达 30%。"
  • 开发者 B 在下次团队会议上说:"我仔细研究了在类声明中添加 final 关键字的性能影响。首先,我进行了更长时间的测试,没有测量到超过 5% 的加速。最初观察到的 30% 加速是由测试不稳定性引起的异常值。我还注意到用于测量的两台机器配置不同:虽然 CPU 相同,但其中一台机器的内存模块更快。我在同一台机器上重新运行了测试,观察到的性能差异在 1% 以内。我比较了变更前后生成的机器码,没有发现显著差异。此外,我比较了执行的指令数、缓存未命中次数、页面错误、上下文切换等,没有发现任何异常。此时,我得出结论:final 关键字的性能影响与我们可以进行的其他优化相比可以忽略不计。"

开发者 A 的基准测试是以被动方式进行的。结果的呈现没有任何技术解释,性能影响被夸大了。相比之下,开发者 B 进行了主动基准测试(active benchmarking)1 她确保了正确的机器配置,进行了广泛的测试,深入了解了一个层次,并收集了尽可能多的指标来支持其结论。她的分析解释了她所观察到的性能结果的底层技术原因。

你应该有良好的直觉来发现可疑的基准测试结果。每当你看到看起来好得令人难以置信、且没有任何技术解释的基准测试结果时,应该持怀疑态度。呈现测量结果本身没有问题,但正如 John Ousterhout 所说:"性能测量应被视为有罪,直到被证明无罪。"[MeasureOneLevelDeeper] 验证结果的最佳方法是通过主动基准测试。主动基准测试比被动基准测试需要付出更多努力,但这是获得可靠结果的唯一方式。

1. 由 Brendan Gregg 提出的术语 - https://www.brendangregg.com/activebenchmarking.html

results matching ""

    No results matching ""