我试图通过消除我不关心的噪音和计算来描述(使用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白雪如山:(并说零指示......)
我是否正确使用了宏/选项?知道我需要改变什么才能获得预期的结果吗?
答案 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
请注意: