3

我经常阅读有关一些新框架及其“基准”的声明。我的问题是一般性的,但具体到以下几点:

  1. 开发人员应该采取什么方法来有效地检测代码来衡量性能?

  2. 在阅读基准和性能测试时,有哪些需要注意的危险信号可能不代表真实结果?

4

2 回答 2

4

有两种衡量性能的方法:使用代码检测和使用采样。

我过去使用的商业分析器(Hi-Prof、Rational Quantify、AQTime)使用了代码检测(其中一些也可以使用采样),根据我的经验,这提供了最好、最详细的结果。特别是 Rational Quantity 允许您放大结果、关注子树、删除完整的调用树以模拟改进,...

这些检测分析器的缺点是它们:

  • 往往很慢(您的代码运行速度慢了大约 10 倍)
  • 花费一些时间来检测您的应用程序
  • 并不总是正确处理应用程序中的异常(在 C++ 中)
  • 如果您必须禁用 DLL 的检测,可能很难设置(我们必须禁用 Oracle DLL 的检测)

检测有时还会歪曲低级功能(如内存分配、临界区等)报告的时间...

我使用的免费分析器(Very Sleepy,Luke Stackwalker)使用采样,这意味着进行快速性能测试并找出问题所在要容易得多。这些免费的分析器不具备商业分析器的全部功能(尽管我自己为非常困倦提交了“专注于子树”功能),但由于它们速度很快,因此它们非常有用。

目前,我个人最喜欢的是非常困倦,Luke StackWalker 排在第二位。

在这两种情况下(仪器和采样),我的经验是:

  • 在应用程序的不同版本中比较分析器的结果非常困难。如果您在 2.0 版中遇到性能问题,请分析您的 2.0 版并尝试改进它,而不是寻找 2.0 比 1.0 慢的确切原因。
  • 您绝不能将分析结果与在分析器之外运行的应用程序的计时(实时、cpu 时间)结果进行比较。如果您的应用程序在探查器之外消耗了 5 秒的 CPU 时间,并且在探查器中运行时探查器报告它消耗了 10 秒,那么没有任何问题。不要认为您的应用程序实际上需要 10 秒。
  • 这就是为什么您必须始终如一地在同一环境中检查结果的原因。在分析器外部运行或在分析器内部运行时,始终比较应用程序的结果。不要混淆结果。
  • 还要使用一致的环境和系统。如果您的 PC 速度更快,您的应用程序可能仍会运行得更慢,例如,因为屏幕更大,需要在屏幕上更新更多内容。如果迁移到新 PC,请在新 PC 上重新测试应用程序的最后(一或两个)版本,以便了解时间如何扩展到新 PC。
  • 这也意味着:使用固定数据集并检查您对这些数据集的改进。可能是您的应用程序的改进提高了数据集 X 的性能,但使用数据集 Y 使其变慢。在某些情况下,这可能是可以接受的。
  • 事先与测试团队讨论您希望获得什么结果(请参阅 Oded 对我自己的问题的回答What's the best way to 'indicate/numerate' performance of an application?)。
  • 意识到如果速度较快的应用程序使用多线程而速度较慢的应用程序不使用,那么速度较快的应用程序仍然可以比速度较慢的应用程序使用更多的 CPU 时间。讨论(如前所述)测试时间什么需要测量,什么不需要测量(在多线程情况下:实时而不是 CPU 时间)。
  • 意识到许多小的改进可能会导致一个大的改进。如果您在应用程序中发现 10 个部分,每个部分花费 3% 的时间,并且您可以将其减少到 1%,那么您的应用程序将快 20%。
于 2010-02-27T12:44:19.140 回答
1

这取决于你想要做什么。

1)如果你想维护一般的时间信息,所以你可以警惕回归,各种仪器分析器是要走的路。确保他们测量各种时间,而不仅仅是 CPU 时间。

2)如果您想找到使软件更快的方法,那是一个截然不同的问题。
你应该把重点放在发现上,而不是测量上。

  • 为此,您需要对调用堆栈进行采样的东西,而不仅仅是程序计数器(如有必要,通过多个线程)。这排除了gprof这样的分析器。

  • 重要的是,它应该在挂钟时间而不是 CPU 时间上进行采样,因为由于 I/O 和由于运算而浪费时间的可能性几乎相同。这排除了一些分析器。

  • 它应该只在您关心时才能够采样,例如在等待用户输入时不能。这也排除了一些分析器。

  • 最后,也是非常重要的,是你得到的总结。获得每行时间百分比是必不可少的。一行使用的时间百分比是包含该行的堆栈样本的百分比。即使使用调用图,也不要满足于仅函数计时。这排除了更多的分析器。(忘记“自我时间”,忘记调用计数。这些很少有用,而且经常误导。)

发现问题的准确性是您所追求的,而不是衡量问题的准确性。这是非常重要的一点。(你不需要大量的样本,虽然它没有害处。害处在你的脑海里,让你考虑测量,而不是它在做什么。)

一个很好的工具是RotateRight的 Zoom profiler。我个人依靠手动采样

于 2010-02-26T22:38:33.407 回答