2012-07-14 104 views
2

我真的很想知道不同程序在我的应用程序中花费了多少时间。 我正在使用GCC 3.4.2与Dev-C++ IDE和gprof进行分析。下面是结果文件的开头 :帮助C++程序分析

平面轮廓:

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls s/call s/call name  
    7.48  0.89  0.89        __gnu_cxx::__exchange_and_add(int volatile*, int) 
    7.39  1.77  0.88        _Unwind_SjLj_Register 
    6.22  2.51  0.74        _Unwind_SjLj_Unregister 
    3.70  2.95  0.44 2425048  0.00  0.00 rt::wctree_node<std::vector<OPT_Inst, std::allocator<OPT_Inst> > >::get(std::string, bool&) 
    3.28  3.34  0.39        std::string::operator[](unsigned int) 
    3.11  3.71  0.37        std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() 
    2.86  4.05  0.34        std::string::_M_mutate(unsigned int, unsigned int, unsigned int) 
    2.69  4.37  0.32        __gnu_cxx::__atomic_add(int volatile*, int) 
    2.61  4.68  0.31 38655  0.00  0.00 SPSBase::containerBoxFillSet(double, double, double, double) 

有人能向我解释RT除外:: wctree首当其冲(这些显然不是我做的),在那里做自己来自哪里,他们的目标是什么?

+0

http://stackoverflow.com/a/1779343/23771 – 2012-07-14 17:16:55

回答

1

这两个_Unwind在我看来像异常处理。

_M_mutate似乎表明您正在复制字符串(libstdC++实现的写入时复制行为的实现细节),该配置似乎被配置文件中字符串析构函数的存在加下划线。

我猜原子操作也来自字符串COW行为,因为内部缓冲区是引用计数。

所以看起来你的大部分时间都花在复制std::string左右。

编辑:好的,现在看看你的rt::wctree<>::get(std::string, bool&)。该参数通过复制传递。 2425048电话,2425048份。你为什么不试试const&这里?

+0

echange_and_add事情如何? 我试图通过使用-fno-exceptions 来避免异常处理,它似乎不起作用。我究竟做错了什么? – 2012-07-14 16:21:06

+0

@VladimirGazbarov:'__exchange_and_add'和'__atomic_add'都是原子操作。至于做错了,很难说:我在这里猜测。我会添加一个新的珍闻,如果它让你喜欢;) – 2012-07-14 17:04:43

+0

关于被传递的字符串,我很确定字符串中有一个共享指针,只有当被要求更改时,执行复制。我会测试。 下面是另一个重要的结论:向std :: list添加元素会导致所有SjLj unWind与异常确实相关的东西,并且它比将它们添加到std :: vector和std :: vector要多花费大约10倍不使用异常处理。 – 2012-07-15 06:58:27