簡體   English   中英

C ++,實例化std :: vector時性能不佳

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM