【问题标题】:What are your favorite features of a C/C++ performance profiler / analyzer? [closed]您最喜欢 C/C++ 性能分析器/分析器的哪些功能? [关闭]
【发布时间】:2008-12-04 19:01:28
【问题描述】:

我正在尝试选择一个性能分析器来使用。我是一名初学者,不知道在性能分析器中寻找什么。最重要的功能是什么?

【问题讨论】:

    标签: c++ performance profiler


    【解决方案1】:

    如果您使用valgrind,我强烈推荐KCacheGrind 来可视化性能瓶颈。

    【讨论】:

    【解决方案2】:

    我希望在分析器中显示以下功能/输出信息。 1.) 应该能够显示消耗的总时钟周期以及每个功能。

    2.) 如果没有的话,应该说明每个函数所消耗的总时间和花费的时间。

    3.) 它应该能够知道一个函数被调用了多少次。

    4.) 了解内存读取、内存写入、缓存未命中、缓存命中会非常好。

    5.) 每个函数的代码内存

    6.) 使用的数据内存:全局常量、堆栈、堆使用情况。

    =广告

    【讨论】:

      【解决方案3】:

      两个经典答案(假设您在 *nix 世界中)是 valgrindgprof。你想要一些能让你(至少)检查你在每个过程或函数中花费了多少时间的东西。

      【讨论】:

        【解决方案4】:
        • 稳定性 - 能够长时间分析您的进程而不会崩溃或内存不足。令人惊讶的是,有多少商业分析员未能做到这一点。

        【讨论】:

          【解决方案5】:

          goldenmean 说得对,我要补充一点,行执行计数有时也很方便。

          【讨论】:

            【解决方案6】:

            我更喜欢采样分析器而不是检测分析器。探查器应该能够将示例数据映射回源代码,最好是在 GUI 中。我知道的两个最好的例子是:

            【讨论】:

              【解决方案7】:

              您只需要一个带有“暂停”按钮的调试器或 IDE。它不仅是最简单、最便宜的工具,而且根据我的经验,它是最好的。 This is a complete explanation why. Note the 2nd-to-last comment.

              编辑因为我想到了一个更好的答案:

              顺便说一句,我学习了人工智能。在 70 年代,一个非常流行的想法是自动编程,许多人试图实现它。 (我对它很感兴趣。) 这个想法是尝试自动化具有领域知识结构的过程以及所需的功能需求,以生成(和调试)能够满足这些需求的程序。 这将是关于编程领域的自动推理的一次巡回演出。 有一些诱人的演示,但在实际意义上,该领域并没有走得太远。 尽管如此,它确实为编程语言贡献了很多想法,比如合约和逻辑验证技术。

              为了构建一个理想的分析器,为了优化程序,它会每纳秒获取一个程序状态的样本。 无论是在运行中还是稍后(理想,记得吗?)它都会仔细检查每个样本,看看在知道程序执行的原因后,特定纳秒的工作是否实际上是必要的,或者可以以某种方式消除。

              这将是数十亿个样本和大量推理,但当然会有大量重复,因为任何浪费成本,例如 10% 的时间,在 10% 的样本上都会很明显。 这种浪费可以在不到 10 亿个样本中识别出来。 如果事实上,100 个甚至更少的样本可以发现它,只要它们是在时间上随机选择的,或者至少在用户关心的时间间隔内。 这是假设目的是找到浪费以便我们可以摆脱它,而不是非常精确地测量它。

              为什么将所有推理能力应用于每个样本会有帮助? 好吧,如果程序很小,而且它只是在寻找诸如 O(n^2) 代码之类的东西,那应该不会太难。 但是假设程序的状态由一个 20-30 层深的过程堆栈组成,可能不止一次出现一些递归函数调用,可能有一些函数调用外部处理器来执行 IO,可能程序的操作是由表中的一些数据驱动。 然后,要确定特定样本是否浪费,需要潜在地检查所有或至少部分状态信息,并使用推理能力来确定它是否真的有必要完成功能要求。

              分析器正在寻找的是由于可疑原因而花费的纳秒。 要查看它被花费的原因,需要检查堆栈上的每个函数调用站点,以及围绕它的代码,或者至少是其中一些站点。 花费纳秒的必要性需要在堆栈上执行每条语句的必要性的逻辑与。 只需要 一个这样的函数调用站点 就有一个可疑的理由,整个样本就有一个可疑的理由。 因此,如果整个目的是为了找出因可疑原因而花费的纳秒,那么样本越复杂越好, 每个样本的推理能力越强越好。 (这就是为什么更大的程序有更大的加速空间 - 它们有更深的堆栈,因此调用更多,因此更有可能出现不合理的调用。)

              好的,那是未来。 但是,由于我们不需要大量样本(10 或 20 个非常有用),而且我们已经拥有高度智能的自动编程器(由比萨和苏打水驱动), 我们现在可以这样做了。

              将其与我们今天称为分析器的工具进行比较。 他们中的佼佼者会采集堆栈样本,但他们的输出是什么? 测量。 “热门路径”。鼠窝图。秀色可餐。 从中,即使是人工智能程序员也很容易错过很大的低效率,除了那些输出暴露的那些。 在你修复了你找到的那些之后,那些你没有找到的才是最重要的。

              学习人工智能学到的东西之一。也就是说,如果人类原则上做不到,不要指望能够对计算机进行编程来做某事。

              【讨论】:

                猜你喜欢
                • 2011-01-03
                • 1970-01-01
                • 2010-09-06
                • 1970-01-01
                • 2010-09-08
                • 1970-01-01
                • 2010-09-14
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多