是否有任何工具可以给出程序大部分执行时间花费在哪里的某种直方图?
这是针对在 Visual Studio 2008 中使用 C++ 的项目。
是否有任何工具可以给出程序大部分执行时间花费在哪里的某种直方图?
这是针对在 Visual Studio 2008 中使用 C++ 的项目。
你所追求的名字是profiler。尝试使用 Visual Studio Profiler 查找应用程序瓶颈
你需要一个分析器。
Visual Studio Team 版本包括一个分析器(这是您正在寻找的),但您可能只能访问 Professional 或 Express 版本。看看这些线程的替代方案:
你最喜欢的分析工具是什么(用于 C++) Windows 上的原生 C++ 有哪些好的分析器?
你真的不应该优化应用程序的任何部分,直到你测量了它们需要多长时间才能运行。否则,你可能会把努力导向错误的地方,你可能会让事情变得更糟,而不是更好。
我使用了一个名为“AQ Time”的分析器,它提供了你想知道的关于代码性能的每一个细节。虽然不是免费的。。
你可以得到程序计数器的直方图,但它实际上是没有用的,除非你在做一些愚蠢的事情,比如花时间在一个大整数或双精度数组的气泡中。
如果您对字符串数组进行冒泡排序这样简单的操作,PC 直方图只会告诉您在字符串比较例程中有一个热点。这没什么帮助,是吗?
我知道你不会做这样的冒泡排序,但只是为了好玩,让我们假设你做了,它占用了你 90% 的时间。(即,如果你修复它,它可能会快 10 倍。)
这实际上是一件很容易找到的事情,因为如果您只是在调试器中点击暂停按钮,您几乎肯定会看到它在字符串比较例程中停止。然后,如果您将堆栈查找一层,您将直接查看冒泡排序循环,这是您的错误。如果你不确定你是否真的发现了问题,只需暂停几次。你看到这个问题的次数告诉你它的代价有多大。
在多次暂停时出现在调用堆栈上的任何代码行都是在请求您修复它。有些你不能,比如“call _main”,但如果可以的话,你会得到很好的加速,保证。
当你用完了你可以修复的东西时,你就真的在程序的生命周期内调整了程序。
就是这么简单。
您还可以在 Visual Studio 中使用探查器。这是一个不错的工具,但请注意以下缺点:
将您与“专属时间”混淆,如果您专注于行级信息,那几乎是没有意义的。
如果您的程序正在浪费时间进行 I/O,它不会看到这一点,因为当它停止执行 I/O 时,样本会停止,除非您使用插装。
但是,如果您使用仪器,您将不会获得行级信息,而只会获得功能级信息。如果您的功能都很小,那没关系。
让您与“调用树”混淆。对于一行代码来说,重要的是它有多少堆栈样本。如果它位于调用树的许多分支中,调用树不会显示它的实际成本。
如果它告诉你一条线路很昂贵,它不能告诉你为什么。为此,您希望根据需要查看每个样本的尽可能多的状态信息,而不仅仅是摘要。
很难说你什么时候想做样品,什么时候不想做。您希望它在您等待应用程序时进行采样,而不是在它等待您时进行采样。
所以现在你知道你需要一个分析器,你可能没有 Visual Studio 一个,所以非常昏昏欲睡可能会有所帮助。