我试图通过消除不关心的噪声和计算来(与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像雪一样白:(并说零指令...)

我是否正确使用了宏/选项?我需要进行哪些更改才能获得预期的结果?

最佳答案

我终于设法解决了这个问题。这是一个配置问题:

我保留了代码

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万次迭代)基准...不适合进行回归测试)。

08-16 11:59