我想用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一片空白:(并显示零条指令...)
我是否正确使用了宏/选项?有什么想法可以改变以获得期望的结果吗?