簡體   English   中英

std :: vector比普通數組更快?

[英]std::vector faster than plain array?

我剛剛嘗試在std::vector<std::pair<float, unsigned int>> (使用push_back操作填充)和純std::pair<float, unsigned int>> *數組上對std::sort進行基准測試使用new分配,然后一一填寫)。 比較功能只是比較了兩對浮點部分。

出乎意料的是,當在std :: vector上使用16M值時,僅花費了約1940 ms,而在陣列上則花費了約2190 ms。 有人可以解釋向量如何更快嗎? 是由於緩存,還是std :: sort的數組版本實現不佳?

gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6)

Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz - cache size 8192 KB (計算機具有兩個四核CPU,但我認為排序僅為單線程)

編輯:現在您可以稱我為dumbass,但是當我嘗試重現用於測量的代碼時(我已經刪除了原始代碼),我無法重現結果-現在數組版本大約需要1915 +-5ms(在32次運行)。 我只能發誓,我已經對10個測量進行了三次測試(手動),並且得到了相似的結果,但這並不是嚴格的證明。

原始代碼中可能存在一些錯誤,后台處理似乎不太可能,因為我對向量和數組版本進行了交替測量,並且向量結果保持不變,並且沒有用戶登錄。

請將此問題視為已關閉 感謝您的努力。

std::vector<std::pair<float, unsigned int>> (用push_back操作填充)

這會連續存儲所有數據,因此內存位置非常好

std::pair<float, unsigned int>> *數組(使用new分配,然后一一填充)

這會將數據分散到整個內存中。

您已經在vector和簡單數組之間建立了非常不公平的比較。 數組情況中涉及的額外間接將受到傷害,缺乏局部性將導致緩存性能下降。 我很驚訝您看不到支持連續存儲的更大勝利。

他們將使用相同版本的sort 這很可能是隨機的CPU影響,例如緩存或線程上下文切換。

您是否使用-O3來編譯代碼?

如果不是,請執行此操作。 所有其他基准測試結果都是毫無意義的,尤其是對於模板代碼而言。

您是否進行了多次測試?

這樣做是為了防止諸如中斷和/或緩存之類的事情對您的結果產生很大影響。

不要將floatint點比較或算術用作基准。 結果在很大程度上取決於編譯器,平台,編譯器選項等。

您的測試數據是如何創建的?

大多數排序算法所需的時間取決於輸入數據的排序。

您使用哪種時間測量方法? 時鍾周期? 一個計時器?

無論如何,編寫提供可靠結果的基准並不像乍看起來那樣容易。 不要使用基准來確定適合您問題的代碼。

暫無
暫無

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

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