【问题标题】:Callgrind: Profile a specific part of my codeCallgrind:分析我的代码的特定部分
【发布时间】:2012-11-21 05:02:31
【问题描述】:

我正在尝试通过消除我不关心的噪音和计算来分析(使用 Callgrind)我的代码的特定部分。 这是我想做的一个例子:

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    //Method to be profiled with these data
    //Post operation on the data
}

我的用例是回归测试,我想确保所讨论的方法仍然足够快(自上次实施以来,额外指令不到 10%)。 这就是为什么我想要更清晰的输出形式 Callgrind。 (我需要一个 for 循环来处理大量数据,以便对我要分析的方法的行为有一个很好的估计)

我的第一次尝试是将代码更改为:

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_START_INSTRUMENTATION;
    //Method to be profiled with these data
    CALLGRIND_STOP_INSTRUMENTATION;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

添加 Callgrind 宏来控制检测。我还添加了 --instr-atstart=no 选项,以确保我只分析我想要的部分代码......

不幸的是,当我开始使用 callgrind 启动我的可执行文件时,使用此配置时,它永远不会结束...这不是缓慢的问题,因为完整的检测运行持续不到一分钟。

我也试过

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_TOGGLE_COLLECT;
    //Method to be profiled with these data
    CALLGRIND_TOGGLE_COLLECT;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

(或 --toggle-collect="myMethod" 选项) 但是 Callgrind 没有任何调用就给我返回了一个日志(KCachegrind 像雪一样白:(并且说零指令......)

我是否正确使用了宏/选项?知道我需要改变什么才能获得预期的结果吗?

【问题讨论】:

    标签: c++ profiling valgrind callgrind


    【解决方案1】:

    toggle-collect 选项在您指定用作触发器的方法时非常挑剔。您实际上还需要指定它的参数列表,甚至空格也需要匹配!使用与 callgrind 输出中显示的方法名称完全相同的方法名称。例如,我正在使用这个调用:

    $ valgrind 
        --tool=callgrind 
        --collect-atstart=no 
        "--toggle-collect=ctrl_simulate(float, int)"
        ./swaag
    

    请注意:

    • 选项周围的双引号。
    • 包含括号的参数列表。
    • 逗号后的空格。

    【讨论】:

      【解决方案2】:

      我终于设法解决了这个问题......这是一个配置问题:

      我保留了代码

      for (int i=0; i<maxSample; ++i) {
          //Prepare data to be processed...
          CALLGRIND_TOGGLE_COLLECT;
          //Method to be profiled with these data
          CALLGRIND_TOGGLE_COLLECT;
          //Post operation on the data
      }
      CALLGRIND_DUMP_STATS;
      

      但是使用 --collect-atstart=no (并且没有 --instr-atstart=no!!!)运行 callgrind 并且在合理的时间内(约 1 分钟)运行良好.

      START/STOP 检测的问题是 callgrind 在每次迭代(每次 STOP)时都会转储一个文件(callgrind.out.#number),因此它真的很慢......(5 分钟后我只有 5000 次运行300 000 次迭代基准测试...不适合回归测试)。

      【讨论】:

      • 所以你不启动/停止仪器?
      • @Paschalis start/stop 将在您每次调用 stop 时创建新的转储。如果您想在一个报告中获得聚合,切换似乎是要走的路(基本上它只是翻转活动/非活动仪表)。
      • 感谢@joetde 的回复。我之所以问,是因为我面临一个问题,即 callgrind 或任何其他工具的回调/宏似乎从未被调用过。更多 here!
      • @joetde 很好的问答!作为推论,callgrind 是否会减慢您未测量的代码部分的执行速度?
      猜你喜欢
      • 2018-10-29
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      相关资源
      最近更新 更多