您如何找到程序中最不优化的部分?

时间:2008-12-02 21:20:38

标签: c++ visual-studio optimization profiler

是否有任何工具可以提供程序大部分执行时间所用的直方图?

这适用于在visual studio 2008中使用c ++的项目。

5 个答案:

答案 0 :(得分:13)

您所追求的名称是分析器。试试Find Application Bottlenecks with Visual Studio Profiler

答案 1 :(得分:6)

您需要profiler

Visual Studio Team版本包含一个分析器(您正在寻找的),但您可能只能访问Professional或Express版本。看看这些线程的替代品:

What's your favorite profiling tool (for C++) What are some good profilers for native C++ on Windows?

在测量运行所需的时间之前,您真的不应该优化应用程序的任何部分。否则你可能会把工作指向错误的地方,而你可能会把事情变得更糟,而不是更好。

答案 2 :(得分:1)

我使用了一个名为“AQ Time”的分析器,它提供了有关代码性能的所有细节。它不是免费的..

答案 3 :(得分:1)

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

如果你做一些像字符串数组的冒泡那样简单的事情,那么PC直方图只会告诉你字符串比较例程中有一个热点。 这没什么帮助,是吗?

我知道你不会做这样的泡泡排序,但只是为了好玩,让我们假设你做了,它占用了90%的时间。 (即如果你修好它,可能会快10倍。)

这实际上是一件非常容易找到的事情,因为如果您只是在调试器中点击暂停按钮,您几乎肯定会看到它在字符串比较例程中停止。然后,如果你在堆栈中查找一个级别,你将直接查看冒泡排序循环,这是你的错误。如果您不确定自己是否真的发现了问题,请暂停几次。您看到问题的次数告诉您它的成本是多少。

多个上的调用堆栈上出现的任何代码行都会暂停,请求您修复它。有些你不能,比如“打电话_main”,但如果可以的话,你会得到一个很好的加速,保证。

Then do it again, and again.

如果你用完了可以修复的东西,那么你真的已经把这个程序调整到了它的一寸之内。

就这么简单。


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

  • 让您感到困惑的是“独家时间”,如果您专注于线路信息,那几乎毫无意义。

  • 如果您的程序浪费时间进行I / O,则不会看到,因为当它停止进行I / O时,样本会停止,除非您使用仪器。

  • 但是如果使用检测,则不会获得行级信息,只能获得功能级别的信息。如果你的功能都很小,那就没关系。

  • 让您对“呼叫树”感到困惑。对于一行代码而言重要的是它所处的堆栈样本数量。如果它位于调用树的许多分支中,则调用树将不会显示它的实际成本。

  • 如果它告诉您线路成本高昂,则无法告诉您原因。为此,您希望根据需要查看每个样本的状态信息,而不仅仅是摘要。

  • 当您想要做样品时,很难说清楚它,何时不需要。您希望它在您等待应用程序时进行采样,而不是在等待您时进行采样。

答案 4 :(得分:0)

现在你知道你需要一个分析器,你可能没有Visual Studio,所以Very Sleepy可能会有所帮助。