2008-12-02 37 views

回答

6

您需要profiler

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

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

,直到你已经测量他们采取跑了多久你真的不应该优化应用程序的任何部分。否则,你可能会在错误的地方投入努力,而你可能会让事情变得更糟,而不是更好。

1

我使用了一个叫“阿Q时代”分析器,让你想了解你的代码的性能每一个细节。这不是免费的,但..

0

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

1

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

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

我知道你不会做这样的冒泡排序,但只是为了好玩,让我们假设你已经做到了,而且这占了你90%的时间。 (也就是说,如果你修复了它,速度可能会提高10倍)。

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

出现在调用堆栈上的任何代码行多个暂停,是乞求您解决它的问题。有些你不能像“call _main”一样,但是如果你能的话,你会得到一个很好的加速,保证。

Then do it again, and again.

当你用完的东西,你可以修复,那么你真的调整了生活的一英寸之内的程序。

就这么简单。


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

  • 混淆你“独占时间”,而如果你专注于线级别的信息,几乎是毫无意义的。

  • 如果你的程序浪费时间做I/O,它不会看到这个,因为当它停止执行I/O时,停止采样,除非你使用仪器。

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

  • 令人困惑的是“呼叫树”。一行代码的重要性在于它有多少堆栈样本。如果它在调用树的许多分支中,调用树将不会显示它真正花费的成本。

  • 如果它告诉你一条线是昂贵的,它不能告诉你为什么。为此,您希望根据需要在每个样本上看到尽可能多的状态信息,而不仅仅是总结。

  • 很难告诉你什么时候你想做样本,什么时候不做。您希望在您等待应用程序时进行采样,而不是在等待您时进行采样。