[英]C++, bad performance when instantiating a std::vector
我有一個關於std :: vector的實例化的問題。 我比較了std :: vector的實例化和相同大小的數組的動態分配。 我期望std :: vector的實例化會花費更長的時間,但是我在性能上有很大的不同。
對於數組,我有53 us對於std :: vector,我有4338 us
我的代碼:
#include <chrono>
#include <vector>
#include <iostream>
int main() {
unsigned int NbItem = 1000000 ;
std::chrono::time_point<std::chrono::system_clock> start, middle ,end;
start = std::chrono::system_clock::now() ;
float * aMallocArea = (float *)calloc(sizeof(float)*NbItem,0) ;
middle = std::chrono::system_clock::now() ;
std::vector<float> aNewArea ;
middle = std::chrono::system_clock::now() ;
aNewArea.resize(NbItem) ;
//float * aMallocArea2 = new float[NbItem];
end = std::chrono::system_clock::now() ;
std::chrono::duration<double> elapsed_middle = middle-start;
std::chrono::duration<double> elapsed_end = end-middle;
std::cout << "ElapsedTime CPU = " << elapsed_middle.count()*1000000 << " (us) " << std::endl ;
std::cout << "ElapsedTime CPU = " << elapsed_end.count()*1000000 << " (us) " << std::endl ;
free(aMallocArea) ;
return 0;
}
即使創建大小為0的向量,我也有這種差異。 您知道為什么在實例化std :: vector時會有如此差的性能嗎? 您是否知道如何改善此問題(我嘗試使用編譯選項-O3,但未給出出色的結果)。
編譯行:g ++ --std = c ++ 11 -o test ./src/test.cpp
編譯器版本:g ++ --version g ++(Debian 4.7.2-5)4.7.2版權所有(C)2012自由軟件基金會,公司。 請參閱復制條件的來源。 沒有保修; 甚至不是出於適銷性或針對特定目的的適用性。
您是否意識到:
float * aMallocArea = (float *)calloc(sizeof(float)*NbItem, 0);
意味着“分配sizeof(float)*NbItem
項的大小為零”? 這意味着該調用執行零字節分配。
即使您更正了此問題,在許多情況下, calloc
表單也會更快。 calloc
實現能夠“保留”內存域並返回指針。 當您訪問內存時,操作系統會映射虛擬內存。
另一方面,向量實際上會經過並初始化/構造其元素。 我知道沒有實現可以檢查a)類型為POD,b)內存為零以及c)分配器返回零內存的情況。 因此,與calloc
相比,此初始化過程可能要花很多錢。
因此,“ C”版本幾乎什么也不做(如果您修復程序),“ C ++”版本可以通過,初始化每個元素並觸摸分配中的所有內存。 它將慢很多。
即使在性能很重要的情況下,也很少有理由支持C版本。 實際上,您應該只分配實際需要的內存。 一旦你開始使用的東西內存,時間將拉平(在C版本例如,它需要一定的時間,當您日后訪問來映射內存)。 如果您要創建第二個計時測試,(說)計算的陣列元素的平均,C ++版本可能會更快您的實現,因為內存已被映射和初始化,而C版本將執行映射和初始化當您讀取內存時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.