关于c ++:如何找到程序中最不优化的部分?

How do you find the least optimized parts of a program?

有没有什么工具可以给出程序大部分执行时间的柱状图?

这是在Visual Studio 2008中使用C++的项目。


你的名字是一个分析器。尝试使用Visual Studio探查器查找应用程序瓶颈


你需要一个分析器。

Visual Studio Team Edition包含一个探查器(这是您要查找的内容),但您可能只能访问专业版或速成版。请查看这些线程以了解替代方案:

你最喜欢的剖析工具(C++)在Windows上有什么好的本地C++分析器?

你真的不应该优化应用程序的任何部分,直到你测量了它们运行的时间。否则,你可能把努力指向了错误的地方,你可能使事情变得更糟,而不是更好。


你可以得到程序计数器的柱状图,但是它实际上是无用的,除非你在做一些愚蠢的事情,比如花时间在一个大的整数数组或双精度数组中。

如果你做了一些简单的事情,比如一个冒泡的字符串数组,PC柱状图只会告诉你在字符串比较程序中有一个热点。没什么帮助,是吗?

我知道你不会这样做的,但只是为了好玩,让我们假设你做了,它占用了你90%的时间。(也就是说,如果你修复了它,它可以快10倍。)

这实际上是一件很容易找到的事情,因为如果你只在调试器中点击暂停按钮,你几乎肯定会看到它在字符串比较例程中停止。然后,如果您在一个级别上查看堆栈,那么您将直接查看Bubble排序循环,这就是您的bug。如果你不确定你真的发现了问题,就暂停几次。你看到这个问题的次数告诉你它有多贵。

在多次暂停时出现在调用堆栈上的任何一行代码,都是请求您修复它的代码。有些你不能,比如"呼叫主",但如果你能,你会得到一个很好的加速,保证。

然后一次又一次地做。

当你用完了你能修复的东西,那么你就真的在它生命的一英寸之内调整了程序。

就这么简单。

您也可以在Visual Studio中使用探查器。这是一个很好的工具,但要注意这些缺点:

  • 把你和"排他时间"混淆在一起,如果你把注意力集中在行级别的信息上,几乎没有意义。

  • 如果你的程序在做I/O时浪费时间,它不会看到这一点,因为当它停止做I/O时,除非你使用仪器,否则样本会停止。

  • 但是,如果您使用instruction,就不会得到行级别的信息,只会得到函数级别。如果你的功能都很小的话就可以了。

  • 把你和"呼叫树"混淆了。对于一行代码来说,重要的是它所使用的堆栈样本数。如果它在调用树的许多分支中,则调用树不会向您显示它的实际成本。

  • 如果它告诉你一条线是昂贵的,它不能告诉你为什么。为此,您需要查看每个样本的状态信息,而不仅仅是摘要。

  • 很难说你什么时候想做样品,什么时候不想。你想让它在你等待应用程序的时候采样,而不是在它等待你的时候。


我使用了一个名为"aq-time"的分析器,它提供了您想要了解的关于代码性能的每一个细节。但这不是免费的……


所以现在您知道需要一个分析器,您可能没有Visual Studio,所以非常困可能会有所帮助。