Callgrind:描述我的代码的特定部分

时间:2012-12-03 17:05:28

标签: c++ profiling valgrind callgrind

我试图通过消除我不关心的噪音和计算来描述(使用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 =&#34; myMethod&#34;选项) 但是Callgrind没有任何电话给我回了一个日志(KCachegrind白雪如山:(并说零指示......)

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

2 个答案:

答案 0 :(得分:14)

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

我保留了代码

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次运行30万次迭代基准......不适合回归测试)。

答案 1 :(得分:2)

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

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

请注意:

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