首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Callgrind:分析我的代码的特定部分

Callgrind:分析我的代码的特定部分
EN

Stack Overflow用户
提问于 2012-12-04 01:05:28
回答 2查看 7.7K关注 0票数 16

我试图(用Callgrind)通过删除我不关心的噪声和计算来分析我的代码的特定部分。下面是我想要做的一个例子:

代码语言:javascript
复制
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循环,以便处理大量数据,以便对我想要分析的方法的行为有一个很好的估计)

我的第一次尝试是将代码更改为:

代码语言:javascript
复制
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启动我的可执行文件时,它永远不会结束...这不是速度慢的问题,因为完整的检测运行时间不到一分钟。

我也试过了

代码语言:javascript
复制
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是白色的,像雪一样:(并且说是零指令...)

我是否正确使用了宏/选项?你知道我需要改变什么才能得到预期的结果吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-04 18:27:46

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

我保留了代码

代码语言:javascript
复制
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次迭代基准测试...不适用于回归测试)。

票数 18
EN

Stack Overflow用户

发布于 2017-08-02 02:29:51

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

代码语言:javascript
复制
$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)"
    ./swaag

请注意:

  • 选项两边的双引号。
  • 包括逗号后的parentheses.
  • The空格的参数列表。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13688185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档