2011-09-08 55 views
6

我有一個關於在C++中std :: vector <>的性能的問題。通過調用clear()方法重用相同的矢量還是快速重新創建矢量更快?更快:重新創建或清除()?

下面的例子是沒有現實生活中的代碼,它只是爲了明確的問題是什麼:

//Example ONE: is this faster 
std::vector<int> foo; 
for(int i = 0; i < 100; ++i) 
{ 
    foo.clear(); 
    for(int j = 0; j < 100; ++j) 
    { 
     foo.push_back(i+j); 
    } 
} 

//Example TWO: or is that faster? 
for(int i = 0; i < 100; ++i) 
{ 
    std::vector<int> foo; 
    for(int j = 0; j < 100; ++j) 
    { 
     foo.push_back(i+j); 
    } 
} 
+0

這些東西不是依賴於實現嗎? –

+6

配置文件。 Boooooring! –

+3

爲什麼所有的downvotes? – Daniel

回答

7

clear()無法按合同解除分配vector內存,而不是僅僅將內部「大小」標誌到0,這樣的方法會更快。

+1

不止是「稍微」,我會說。 –

+1

我不知道釋放內存的任何實現。 –

+0

@大衛:創建一個新的矢量呢! :D [編輯:是的,好吧,讓老的死] –

0

示例2對std :: vector中的數組重複了堆分配。示例1的速度更快,因爲它避免了在堆上重複分配內存,除非需要在內部調整內存大小。

+0

's /在堆上分配內存/動態分配內存/' –

0

您必須爲您的編譯器運行基準測試。 clear()和'分配'方法是依賴於實現的。

+0

矢量永遠不會縮小的容量根本不依賴於實現。 [編輯:雖然C++ 11 _does_有'shrink_to_fit'] –

+0

@Tomalak:我其實在想這件事。標準中沒有具體的條款禁止實現實際釋放內存。一個*縮小的向量在很多情況下很難實現(同時保持'push_back'的*分期不變的時間*成本),但我認爲它不可能*,並且對於一般情況'清除',具體清除()'我沒有看到任何理由爲什麼一致性實現無法釋放內存(然後,我沒有看過這個標準尋找這種特殊情況......) –

+0

@大衛:我也一直在探討。我看不到任何保證'clear' *必須*調用'reserve'。這似乎相當強烈地暗示給我,但沒有說明。 –

2

這取決於std::vector在C++中,您使用標準庫的實現,但它很可能是第一種情況下會更快,因爲當你調用std::vector::clear大多數的實現實際上並不自由分配的內存。因此,第一次在第一次執行內部循環時不執行重複分配。

0

既清除載體和降低其能力,以您的實現的最低,Scott Meyers建議交換技巧

std::vector<int>().swap(foo); 

這也將不是通過手卷環路到矢量迭代速度更快恢復其內容。

1

是的。不,第一個可能更快。這取決於。唯一有用的答案來自您在自己的環境中分析自己的代碼。

嘗試分析你的代碼,看看會發生什麼。編譯your program at ideone顯示,對於一個特定的編譯器/操作系統/機器/運行,你的第一個例子加快4倍。

this program顯示了一箇中間解決方案,該編譯器/ os/machine/run的中間解決方案比#2更快,比#1更慢。

0

在這種特定情況下,大多數機器上的重用情況可能會更快。您正在存儲不需要銷燬的原始數據(甚至有一個析構函數)。另一方面,如果矢量包含非POD對象,每個元素將被clear的調用破壞。第三方面,所有的累積數據最終都需要被破壞。