【问题标题】:Profiling line-by-line in C++在 C++ 中逐行分析
【发布时间】:2010-10-13 09:13:30
【问题描述】:

我有一个要优化的 C++ 程序。 因为我希望它运行得快,所以我没有使用很多函数调用。我见过的大多数分析工具都可以在函数调用分辨率中为您提供分析信息。但是,我希望它具有逐行分辨率。有这样的选择吗?

我在 Windows 上使用 Visual Studio 2010。

谢谢。

【问题讨论】:

  • 只使用 VS2010 或者其他工具可以吗?
  • 我想我可以使用其他东西,虽然我想花一点时间来尝试找出其他东西在技术上是如何工作的,弄乱编译器选项等等。
  • 请注意。优化器处理您的代码后,汇编指令和源代码中的行之间不再存在明确的一对一关系。一行可以对应多个不相近的汇编操作,一条汇编指令可能同时来自多行。
  • “不使用大量函数调用”——如果你有像数学计算这样的小步骤,并且你真的专注于一个函数,那么分析可能会破坏你的并行性和性能——尝试一下,但也要运行核心循环几千/几百万次并测量经过的时间,然后尝试你能想到的所有替代实现。您可能会考虑移植到 Linux 并尝试使用 valgrind,因为您可能会发现一些 CPU/内存架构等固有的性能问题。
  • 规则 8:不要过早优化 (gotw.ca/publications/c++cs.htm)。使用您的分析器并确认函数调用会减慢您的速度,然后再担心消除它们。函数可帮助您对计算进行分组,并可能在算法中找到更大的优化。优化器通常可以在较小的代码块上做得更好。

标签: c++ visual-studio-2010 profiling


【解决方案1】:

Intel Parallel Amplifier 应该能够满足您的需求。如果这是你想要的:

【讨论】:

    【解决方案2】:

    如果您在 AMD 处理器上运行,CodeAnalyst 是免费的并且可以做到这一点(至少,在基于时间的分析中);您实际上可以“放大”和缩小查看从进程到函数再到单个汇编指令占用最多 CPU 时间的内容。

    但是,请记住,要通过基于时间的分析获得有意义的结果,您应该多次运行代码的关键部分,否则您获得的统计数据没有多大意义。

    顺便说一句,我认为你应该忘记更少的函数调用=>更快的想法。如果函数调用的成本大于其“有效负载”,编译器应该能够自行判断内联调用是否方便,在某些情况下,即使内联过多也会减慢代码的速度。

    【讨论】:

    • CodeAnalyst 中基于时间的分析也适用于其他处理器。
    • 函数的成本比进入和离开它们所花费的周期要大。更大的成本是它们就像一张信用卡,鼓励你使用它们而不是明智的。当这种趋势在几层上叠加时,不需要太多的判断松懈就可以构成一个重大问题。
    【解决方案3】:

    AQTime 是一个用于 Windows 的商业分析器,我发现它在函数和线路时序上都工作得很好。我喜欢它的一件事是你不必摆弄编译器选项或 Visual Studio 设置——即你不需要任何附加编译器选项来启用分析:你需要做的所有分析是 pdb(符号)文件和可执行文件。 (是的,您可以为您的发布编译创建一个 pdb 文件。)

    【讨论】:

      【解决方案4】:

      恕我直言,this method is best,代表these reasons,这是43x speedup 的示例。对于one exampleanotheranother,这不是一个众所周知的技术,除了少数人。您可能会惊讶于它的技术含量非常低且手动,但您无法超越结果。

      哦,顺便说一下,对于 Visual Studio,LTProf 很可能是下一个最佳选择。它为您提供行级百分比,这些百分比源自随机挂钟时间获取的堆栈样本。不要被许多花哨的 UI 选项或时间准确性的承诺所吸引。那些东西都无所谓。重要的是它指出了值得优化的地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 2014-12-18
        相关资源
        最近更新 更多