2016-03-02 68 views
0

我正在使用gprof分析代碼,我觀察到 - >運算符消耗大量時間。C++在地圖訪問和迭代中採用的時間

這是地圖的樣本定義。

map<int, vector<int> > myMap; 

我有一個迭代器,

map<int, vector<int> >::iterator it; 

我經常運行像循環:

for(it = myMap.begin(), it != myMap.end(); it++) { 
    //Do stuff 
} 

這是剖析

Function: 
std::_Rb_tree_iterator<std::pair<int const, std::vector<ClassType*, std::allocator<ClassType*> > > >::operator->() const 
Time Consumed: 
20.18% 
Number of Times function is called: 
15285739415 

Function: 
std::_Rb_tree_iterator<std::pair<int const, std::vector<ClassType*, std::allocator<ClassType*> > > >::operator++(int) 
Time Consumed: 
2.90% 
Number of Times function is called: 
3825378111 

從我的理解中的數據,+ +運算符計算下一個採用0的元素和 - >給出應該採取O(1)時間的元素。 即使 - >運算符被稱爲多於++運算符,我認爲它不應該消耗這麼多時間。 不應該++->運算符消耗更多的時間?

+0

您是否正在編譯優化?在沒有優化的情況下進行性能分析並不具有代表性 –

+0

另請注意,運算符+>被調用的次數是運算符++的4倍。這是打算?而且,該標準要求迭代器的所有操作都要分攤到接觸時間([iterator.requirements.general] P8)。因此,增量也是O(1) –

+0

我正在編譯沒有優化。我將嘗試編譯優化。 - >因爲我更頻繁地訪問內存,所以稱爲多於++。如果++是O(1),那麼哪個運算符計算下一個節點?看看 - >的函數調用,我不認爲 - >計算下一個節點。 – Rajs123

回答

0

內存訪問(->運算符)通常比算術運算(++運算符)慢得多。

這是由於搜索數據需要時間,從最底層(最靠近寄存器)的緩存開始,一直到硬盤驅動器中的可能頁面。正如您所預料的那樣,這會花費相當長的時間,讓您遠離寄存器。但是,算術運算可能不需要涉及內存訪問。如果算術運算中涉及的數據可以放入寄存器中,那麼甚至不需要訪問最底層的緩存。

以下是關於緩存一致性/空間位置如何影響應用程序速度的good article