【发布时间】: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