我试图(用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;(或者--KCachegrind-collect=“Callgrind”选项)但是Callgrind返回了一个日志,没有任何调用(Callgrind是白色的,像雪一样:(并且说是零指令...)
我是否正确使用了宏/选项?你知道我需要改变什么才能得到预期的结果吗?
发布于 2012-12-04 18:27:46
我终于设法解决了这个问题……这是一个配置问题:
我保留了代码
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运行了callgrind (没有--instr-atstart=no!)它在合理的时间内(~1分钟)工作得很好。
启动/停止插装的问题是,callgrind在每次迭代(每次停止)时都会转储一个文件(callgrind.out.#number),因此它真的很慢……(5分钟后,我只运行了5000次,用于300,000次迭代基准测试...不适用于回归测试)。
发布于 2017-08-02 02:29:51
在如何指定用作触发器的方法时,toggle-collect选项非常挑剔。实际上,您还需要指定它的参数列表,甚至空格也需要匹配!使用与callgrind输出中显示的完全相同的方法名称。例如,我使用这个调用:
$ valgrind
--tool=callgrind
--collect-atstart=no
"--toggle-collect=ctrl_simulate(float, int)"
./swaag请注意:
https://stackoverflow.com/questions/13688185
复制相似问题