是否有任何工具可以提供某种直方图来显示程序的大部分执行时间都花在哪里?

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

有帮助吗?

解决方案

你后的名称是概述。尝试查找应用中的瓶颈与Visual Studio探查

其他提示

您需要一个探查

Visual Studio团队版包括一个分析器(这是你在找什么),但你可能只有获得本专业或速成版。看看这些线程的替代品:

什么(对于C ++)你最喜欢的分析工具 什么是在Windows本地C ++一些很好的剖析<? / A>

您,直到你已经测量他们需要多长时间运行真的不应该优化应用程序的任何部分。否则,你可能会指挥错了地方努力,你可能使事情变得更糟,而不是更好。

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

您可以获得程序计数器的直方图,但它实际上是无用的,除非您正在做一些愚蠢的事情,例如花时间在一大堆整数或双精度数的冒泡排序中。

如果您执行一些简单的操作,例如对字符串数组进行冒泡排序,则 PC 直方图只会告诉您字符串比较例程中有一个热点。这没什么帮助,不是吗?

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

它实际上是一件非常容易找到的事情,因为如果您只是按下调试器中的暂停按钮,您几乎肯定会看到它停止在字符串比较例程中。然后,如果您向上一级查找堆栈,您将直接查看冒泡排序循环,这就是您的错误。如果您不确定是否真的发现了问题,只需暂停几次即可。您看到该问题的次数就可以告诉您该问题的代价有多大。

出现在调用堆栈上的任何代码行 多种的 暂停,是在恳求你修复它。有些你不能,比如“call _main”,但如果你能,你将获得很好的加速,这是保证的。

然后再做一次,再做一次。

当你用完所有可以修复的东西时,你就真的把程序调整到了寿命的边缘。

就是这么简单。


您还可以使用 Visual Studio 中的探查器。这是一个不错的工具,但请注意以下缺点:

  • 用“专属时间”来迷惑你,如果你专注于线路级别的信息,那么它几乎毫无意义。

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

  • 但如果您使用检测,您将无法获得行级信息,而只能获得函数级信息。如果您的函数都很小,那也没关系。

  • 让您与“调用树”混淆。对于一行代码来说,重要的是它有多少个堆栈样本。如果它位于调用树的许多分支中,则调用树不会显示它的实际成本。

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

  • 很难区分什么时候想要做样品,什么时候不想做。您希望它在您等待应用程序时进行采样,而不是在它等待您时进行采样。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top