我经常阅读有关一些新框架及其“基准”的声明。我的问题是一般性的,但具体到以下几点:
开发人员应该采取什么方法来有效地检测代码来衡量性能?
在阅读基准和性能测试时,有哪些需要注意的危险信号可能不代表真实结果?
我经常阅读有关一些新框架及其“基准”的声明。我的问题是一般性的,但具体到以下几点:
开发人员应该采取什么方法来有效地检测代码来衡量性能?
在阅读基准和性能测试时,有哪些需要注意的危险信号可能不代表真实结果?
有两种衡量性能的方法:使用代码检测和使用采样。
我过去使用的商业分析器(Hi-Prof、Rational Quantify、AQTime)使用了代码检测(其中一些也可以使用采样),根据我的经验,这提供了最好、最详细的结果。特别是 Rational Quantity 允许您放大结果、关注子树、删除完整的调用树以模拟改进,...
这些检测分析器的缺点是它们:
检测有时还会歪曲低级功能(如内存分配、临界区等)报告的时间...
我使用的免费分析器(Very Sleepy,Luke Stackwalker)使用采样,这意味着进行快速性能测试并找出问题所在要容易得多。这些免费的分析器不具备商业分析器的全部功能(尽管我自己为非常困倦提交了“专注于子树”功能),但由于它们速度很快,因此它们非常有用。
目前,我个人最喜欢的是非常困倦,Luke StackWalker 排在第二位。
在这两种情况下(仪器和采样),我的经验是:
这取决于你想要做什么。
1)如果你想维护一般的时间信息,所以你可以警惕回归,各种仪器分析器是要走的路。确保他们测量各种时间,而不仅仅是 CPU 时间。
2)如果您想找到使软件更快的方法,那是一个截然不同的问题。
你应该把重点放在发现上,而不是测量上。
为此,您需要对调用堆栈进行采样的东西,而不仅仅是程序计数器(如有必要,通过多个线程)。这排除了像gprof这样的分析器。
重要的是,它应该在挂钟时间而不是 CPU 时间上进行采样,因为由于 I/O 和由于运算而浪费时间的可能性几乎相同。这排除了一些分析器。
它应该只在您关心时才能够采样,例如在等待用户输入时不能。这也排除了一些分析器。
最后,也是非常重要的,是你得到的总结。获得每行时间百分比是必不可少的。一行使用的时间百分比是包含该行的堆栈样本的百分比。即使使用调用图,也不要满足于仅函数计时。这排除了更多的分析器。(忘记“自我时间”,忘记调用计数。这些很少有用,而且经常误导。)
发现问题的准确性是您所追求的,而不是衡量问题的准确性。这是非常重要的一点。(你不需要大量的样本,虽然它没有害处。害处在你的脑海里,让你考虑测量,而不是它在做什么。)
一个很好的工具是RotateRight的 Zoom profiler。我个人依靠手动采样。