我有具有性能敏感的應用程序代碼等性能圖C++找到(克++(GCC)4.4.7 20120313(紅帽4.4.7-3))
for each record r
processRecord(r)
然後
processRecord(record r)
{
for each field in record r
processField (f)
}
當我們的應用程序啓動時,它使用一個xml文件來填充地圖。讓我們稱它爲M.該地圖是字符串和結構。其中strung是xml標籤中的名稱,結構由xml中的所有其他元素組成。
processField中每個字段的處理是一個漫長的操作,我們需要上述地圖M的幫助來查找其在map中指定的屬性並相應地處理該字段。
我們有大量的數據來自外部,當我進行分析時,我發現最大時間花在了對地圖M進行查找操作上。
該地圖由xml中的字段組成,我可以放心地說地圖的大小在50-200之間。
發送到我們的應用程序的記錄數是每秒300個&每個記錄具有與地圖大小相同的比例。
網上的快速搜索表明,可以嘗試使用unordered_map,但它在我的舊C++編譯器中不可用,因爲我們沒有移動到C++ 11,這是我無法控制的東西。同樣在網絡上,對於像我的地圖和unordered_map這樣的小集合似乎會得到類似的結果。
如果地圖創建需要時間作爲一次性活動,但需要快速查找(),我們並不擔心。
所以,當我做了我的分析,我發現最大的時間花在做地圖M上的查找操作,我希望減少它。任何建議?
地圖的特定的API通過我的探查被refered我是(頂部2)
1) std::_Select1st<std::pair<int const, int> >::operator() (this=0x7f1a679eb1bf, __x=...) at /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_function.h:489
and
2) #0 0x00000000005e3d7f in std::_Rb_tree<int, int, std::_Identity<int>, std::less<int>, std::allocator<int> >::~_Rb_tree (this=0x7f1a679ebf72, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_tree.h:613
#1 0x00000000005e3d42 in std::set<int, std::less<int>, std::allocator<int> >::~set (this=0x7f1a679eb5d0, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_set.h:88
編輯 我是能夠改善PERF使用下面:)建議。我測試了一小組隨機數據。在std :: _ Rb_tree *中,我的CPU使用率爲std:map爲〜12.24%。使用boost :: unordered_map我只在boost :: unordered_detail :: *中獲得了4.34%所以這意味着我有~7%的CPU用於其他活動。
地圖持有什麼樣的數據,只是整數? – BlamKiwi
2014年12月當前GCC爲4.9。您應該升級您的編譯器 –
如您所說,如果您不能升級,那麼升序無序地圖可能會有用。 http://www.boost.org/doc/libs/1_57_0/doc/html/unordered/comparison.html –