簡體   English   中英

boost :: container :: vector比std :: vector快嗎? 為什么?

[英]Is boost::container::vector faster than std::vector? Why?

我對boost向量和std向量做了如下有趣的測試

int N = 10000;
{
    boost::timer::auto_cpu_timer t;
    std::vector<int> v;
    for (int i = 0; i < N; ++i)
    {
        v.insert(v.begin(), i);
    }
}

{
    boost::timer::auto_cpu_timer t;
    boost::container::vector<int> v;
    for (int i = 0; i < N; ++i)
    {
        v.insert(v.begin(), i);
    }
}

win32版本,由vc2010,/ O2 / Oy-編譯

對於N = 10000

對於標准向量:壁為0.140849s,用戶為0.140401s + 0.000000s系統= 0.140401s CPU(99.7%)

f提升向量:壁0.056174s,用戶0.062400s + 0.000000s系統= 0.062400s CPU(111.1%)

對於N = 100,000

標准:14.050757s牆,14.055690s用戶+ 0.000000s系統= 14.055690s CPU(100.0%)

提升:牆壁5.585048s,用戶5.584836s + 0.000000s系統= 5.584836s CPU(100.0%)

當兩者都添加reserve(N)時,CPU時間幾乎不變。

他們之間有什么區別嗎? Boost比std快得多,為什么? 謝謝。

檢查sizeof(),std :: vector 16,而boost :: container :: vector 12。

請記住,所有代碼的速度將因編譯器的不同以及該編譯器的版本而異。 標准庫提供了可在平台之間移植的代碼,但是很難保證速度。

如果只在自己的計算機上運行此代碼,則應選擇更快的選項。 如果您因為要做出更快的選擇而問這個問題,那么我認為沒有一種方法可以知道缺少測試的方法。

自然地,當您似乎以一種通用的方式想知道速度時,您需要評估一下是否可以插入許多不同數量的對象,運行許多重復測試以及使用各種對象(類,雙精度,字符等)。 您也可以選擇使用不同數量的可用堆棧空間來完成所有這些操作。 如果您沒有考慮所有因素,那么默認情況下您的問題將變成:“為什么在我的特定情況下,速度會有差異?” 通常很難說。

一個更好的問題可能是:“我在各種測試條件下都觀察到這兩個功能相似的代碼之間的速度差異。它們之間是否存在一些體系結構差異?” 答案可能是。

std :: vector上的cplusplus.com

向量在內部使用動態分配的數組存儲其元素。 插入新元素時,可能需要重新分配該數組以增大大小,這意味着分配新數組並將所有元素移至該數組。 就處理時間而言,這是一項相對昂貴的任務,因此,每次將元素添加到容器時,向量都不會重新分配。

取而代之的是,矢量容器可能會分配一些額外的存儲空間以適應可能的增長,因此,該容器的實際容量可能大於包含其元素(即其大小)所嚴格要求的存儲容量。 庫可以實現不同的增長策略,以在內存使用和重新分配之間取得平衡,但是在任何情況下,重新分配僅應以大小的對數增長間隔進行,以便可以在向量末尾插入單個元素並提供攤銷的恆定時間。復雜度(請參見push_back)。

由此可見,您所看到的行為取決於您所使用的STL庫的特定版本,並且增長應該是對數的,並且增長通常需要大量復制。 雙端隊列不需要大量復制,因此在測試中可以更好地擴展。

大概, boost::container功能類似。 我不知道,因為我找不到關於它的書面記錄。 但是我確實發現了這一點

Boost.Container提供的所有容器都實現插入位置,這意味着可以從用戶參數直接將對象內置到容器中,而無需創建任何臨時對象。 對於沒有可變參數模板的編譯器,支持最多模擬有限個(10)參數的位置插入。

如果std :: vector不使用類似的體系結構,而是創建一個臨時對象,則可能導致運行時差異。 但這可能不適用於int類型。 也許其他人可以找到不同的體系結構差異。

boost :: container中的容器類大量使用了擴展的分配器,這些分配器不僅允許分配和取消分配,構造和解構,而且還盡可能擴展分配的內存塊。 這意味着在許多情況下,復制較少,並且實際上在c ++中的效果與在c中可以實現的效果相當:

char * data;
char * newdata = malloc(newdatasize);
memcpy(newdata,data,datasize);
swap(data,newdata);
free(newdata);

https://www.boost.org/doc/libs/1_68_0/doc/html/container/extended_allocators.html插入int時,沒有一個“放置插入”優化是有意義的,因為int的構造很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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