Callgrind:对我的代码的特定部分进行性能剖析

19

我想用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一片空白:(并显示零条指令...)

我是否正确使用了宏/选项?有什么想法可以改变以获得期望的结果吗?

2个回答

21
我终于成功解决了这个问题…这是一个配置问题:
我保留了代码。
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仪器的问题在于每次迭代(每次STOP)callgrind都会转储一个文件(callgrind.out.#number),因此速度非常慢……(经过5分钟后,我只有300,000个迭代中的5000个运行数据,不适用于回归测试)。


你是不是不开始/停止仪器测试? - Paschalis
1
@Paschalis,每次调用stop都会创建新的转储。如果您想在一个单独的报告中获得聚合结果,则似乎切换是正确的方法(基本上它只是翻转活动/非活动的仪器)。 - joetde
感谢@joetde的回复。我问这个问题是因为我遇到了一个问题,即来自callgrind或任何其他工具的回调/宏似乎从未被调用过。更多信息请参见此处! - Paschalis
@joetde 不错的问答!作为一个推论,callgrind会减慢你没有测量的代码部分的执行吗? - interestedparty333

12

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

$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)"
    ./swaag
请注意:
  • 选项周围的双引号。
  • 包括括号的参数列表。
  • 逗号字符后面的空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接