我经常阅读关于一些新框架及其“基准”的陈述。我的问题是一般问题,但具体问题是:
开发人员应该采用什么方法来有效地检测代码以衡量绩效?
在阅读基准测试和性能测试时,需要注意的一些红色标志可能并不代表实际结果?
答案 0 :(得分:4)
有两种衡量绩效的方法:使用代码工具和使用抽样。
我过去使用的商业剖析器(Hi-Prof,Rational Quantify,AQTime)使用了代码检测(其中一些也可以使用采样),根据我的经验,这给出了最好,最详细的结果。特别是Rational Quantity允许您放大结果,关注子树,删除完整的调用树以模拟改进,...
这些仪器分析器的缺点是它们:
仪器有时也会扭曲报告的内存分配,关键部分等低级功能的时间......
我使用的免费分析器(Very Sleepy,Luke Stackwalker)使用了采样,这意味着更容易进行快速性能测试并查看问题所在。这些免费的分析器没有商业分析器的全部功能(虽然我自己提交了“专注于子树”功能),但由于它们很快,它们非常有用。
此时,我个人最喜欢的是非常困倦,Luke StackWalker排在第二位。
在这两种情况下(仪表和采样),我的经验是:
答案 1 :(得分:1)
这取决于你想要做什么。
1)如果您想维护一般的时间信息,那么您可以对回归保持警惕,可以采用各种仪器分析器。确保它们测量各种时间,而不仅仅是CPU时间。
2)如果你想找到使软件更快的方法,那就是一个截然不同的问题 您应该强调 find ,而不是度量。
为此,您需要对调用堆栈进行采样的内容,而不仅仅是程序计数器(如果需要,可以通过多个线程)。这排除了profilers like gprof。
重要的是,它应该在挂钟时间上进行采样,而不是CPU时间,因为由于处理由于处理而导致的I / O可能会浪费时间。这排除了一些个人资料。
只有在您关心时才应该采样,例如不等待用户输入时。这也排除了一些剖析器。
最后,非常重要的是你得到的摘要。 获得每行百分比至关重要。 一行使用的时间百分比是包含该行的堆栈样本的百分比。 即使使用调用图,也不要满足于仅功能定时。 这排除了更多的分析器。 (忘记“自我时间”,忘记调用计数。这些很少有用,而且经常会产生误导。)
找到问题的准确性是你所追求的,不是衡量它们的准确性。这是非常重要的一点。 (你不需要大量的样本,虽然没有任何伤害。伤害在你的头脑中,让你考虑测量,而不是它在做什么。)
一个很好的工具是RotateRight的缩放分析器。我个人依赖manual sampling。