2012-07-14 60 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