代码之家  ›  专栏  ›  技术社区  ›  DShook

你如何找到程序中优化程度最低的部分?

  •  3
  • DShook  · 技术社区  · 17 年前

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

    这是一个在visualstudio2008中使用c++的项目。

    5 回复  |  直到 17 年前
        1
  •  13
  •   Greg    17 年前

    你要找的名字是 轮廓仪 .试试看 Find Application Bottlenecks with Visual Studio Profiler

        2
  •  6
  •   Community Mohan Dere    9 年前

    你需要一个 profiler .

    Visual Studio团队版包含一个分析器(这就是您要找的),但您可能只能访问专业版或快速版。看看这些线程以寻找替代方案:

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

    在测量应用程序的运行时间之前,你真的不应该优化应用程序的任何部分。否则,你可能把精力放在了错误的地方,你可能会让事情变得更糟,而不是更好。

        3
  •  1
  •   Naveen    17 年前

    我使用了一个名为“AQ Time”的分析器,它提供了你想知道的关于代码性能的每一个细节。但它不是免费的。。

        4
  •  1
  •   Community Mohan Dere    9 年前

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

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

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

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

    出现在调用堆栈上的任何代码行 倍数 暂停,是乞求你修复它的东西。有些你不能,比如“call_main”,但如果你能,你会得到一个很好的加速,保证。

    Then do it again, and again.

    当你没有可以修复的东西时,那么你真的在程序生命的一英寸内调整了它。

    就是这么简单。


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

    • 将你与“专属时间”混淆,如果你专注于行级信息,这几乎毫无意义。

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

    • 但如果你使用插装,你将无法获得行级信息,只能获得函数级信息。如果你的功能都很小,那也没关系。

    • 把你和“呼叫树”混淆了。对于一行代码来说,重要的是它有多少堆栈样本。如果它在调用树的许多分支中,调用树将不会显示它的实际成本。

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

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

        5
  •  0
  •   macbirdie    17 年前

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