2010-09-09 161 views
0

我想知道與編譯和運行時相關的嵌套STL結構的性能。所以如果想要實現一些嵌套的結構,例如那樣嵌套STL結構

vector<vector<map<int, vector<> > > > 

怎樣才能訪問每個容器影響整個執行時間?

感謝您的任何幫助。給予一些具體的鏈接考慮這個問題也非常讚賞。

我最好。

+5

我不確定你在編譯時看到了什麼樣的性能。你的意思是編譯時間很長嗎?運行時性能:在沒有實際用例的情況下,難以說出來(您是否擔心插入/刪除/隨機訪問?)。請注意'矢量使用連續的內存。隨機訪問很好。 'map'是一個不同的野獸(RB樹可能)。你必須測量。 – dirkgently 2010-09-09 08:43:15

+0

儘管如此,嵌套矢量並不是連續的。即如果你有一個向量分別有2個矢量,分別有3個和4個地圖,那麼這7個地圖可能不是連續的。 – MSalters 2010-09-09 09:47:04

+0

你的問題太含糊。編譯器和生成的可執行文件的性能取決於太多的參數。做一些基準找出。 – wilx 2010-09-09 10:00:02

回答

2

訪問每個容器如何影響整個執行時間?

沒有什麼可說的,甚至更少的參考 - 除了STL。 std::vector提供了O(1)對元素的訪問性能(random access),std::map提供了O(log(n))訪問元素的性能。

IOW:

vector<vector<map<int, vector<int> > > > x; 

int i,j,k,l;  
x[i] // goes via std::vector, O(1) 
[j] // goes via std::vector, O(1) 
[k] // goes via std::map, O(log(n)) 
[l]; // goes via std::vector, O(1) 

大多數的訪問將被內聯/由編譯器優化掉了。

爲了幫助編譯器中的位可以在一個變量一些經常訪問的緩存容器,例如:

typedef map<int, vector<int> > map_type; 
typedef vector<vector<map_type> > bigvec_type; 
bigvec_type x; 

int i,j,k,l; 

map_type &m = x[i][j]; 
for (/* some loop over k and l */) { 
    m[k][l]; 
} 

在特定情況下有沒有太大的性能問題。

當代碼使用幾個這樣的大型結構(例如將數據從一個bigvec_type容器移動到另一個容器)時,我的小小挑剔是。儘管漸近式性能不會改變,但編譯器需要生成的代碼量相當大,因爲它無法將所有必需的索引和指針放入寄存器中。爲了避免這種情況,人們通常試圖將結構邏輯地分成幾個層(類似於我的第二個代碼示例),並提供僅與1或2級容器一起工作的方法。

0

表現正是你所期望的。僅僅因爲它們是「嵌套的STL容器」,並不會強加任何隱藏的性能變化。