加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使用KCachegrind和Callgrind仅测量部分代码?

发布时间:2020-12-16 06:50:09 所属栏目:百科 来源:网络整理
导读:我想用valgrind来分析我的代码.问题是,我有一个我不感兴趣的巨大启动序列. 我在valgrind / callgrind.h中找到了应该帮助我的定义: CALLGRIND_START_INSTRUMENTATION CALLGRIND_STOP_INSTRUMENTATION CALLGRIND_DUMP_STATS 根据this article,我必须使用以下
我想用valgrind来分析我的代码.问题是,我有一个我不感兴趣的巨大启动序列.

我在valgrind / callgrind.h中找到了应该帮助我的定义:

> CALLGRIND_START_INSTRUMENTATION
> CALLGRIND_STOP_INSTRUMENTATION
> CALLGRIND_DUMP_STATS

根据this article,我必须使用以下选项执行valgrind:

valgrind –tool = callgrind –instr-atstart = no ./application

当我这样做时,会创建两个文件:

> callgrind.out.16060
> callgrind.out.16060.1

然后我想用kcachegrind来显示我的结果.这很好用,但跳过我的启动序列的makros似乎什么也没做.我只需要在我想要的地方测量性能,我该怎么做?

解决方法

我现在明白了,但我不是百分之百确定原因.我将尝试描述一下我的代码:

我有一个Application类,负责很多子系统.在我最初的尝试中,我尝试测量应用程序内部的性能,如下所示:

int main(int argc,char *argv[])
{
    Application a(argc,argv);
    return a.exec();
}

void Application::Application(int &argc,char **argv)
{
    m_pComplexSystem = new ComplexSystem();
    m_pComplexSystem->configure();

    CALLGRIND_START_INSTRUMENTATION;
    m_Configurator->start();    
}

Application::~Application()
{
    CALLGRIND_STOP_INSTRUMENTATION;
    CALLGRIND_DUMP_STATS;
    m_pComplexSystem ->stop();

    delete m_pComplexSystem;
    m_pComplexSystem = 0;
}

由于某种原因,定义被忽略了,我得到了整个构造函数的性能度量以及在ComplexSystem成员的configure()调用中完成的所有操作.

所以现在我使用这个似乎有用的代码:

int main(int argc,argv);

    CALLGRIND_START_INSTRUMENTATION;
    int result = a.exec();
    CALLGRIND_STOP_INSTRUMENTATION;
    CALLGRIND_DUMP_STATS;
    return result;
}

虽然它与我原来的尝试并不完全相同,但我现在可以开始寻找慢功能了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读