簡體   English   中英

我會使用std :: map而不是vector來看到性能提升 <pair<string, string> &gt;?

[英]Would I see a performance gain using std::map instead of vector<pair<string, string> >?

我目前有一些代碼,我使用pair<string,string>vector 這用於存儲來自XML解析的一些數據,因此,該過程在某些地方非常慢。 在試圖加快整個過程的過程中,我想知道從vector<pair<string,string> >std::map<string,string>是否會有任何性能優勢? 我可以編寫代碼並運行一個分析器,但我想我會看到我是否能得到一個答案,表明首先會有一些明顯的性能提升。 我不需要進行任何排序,我只是將項添加到向量中,然后在稍后階段迭代內容並進行一些處理 - 我不需要排序或任何這種性質。 我猜測也許我不會獲得任何性能提升,但我之前從未實際使用過std::map所以我不知道如果沒有要求或編碼它。

不。如果(如你所說)你只是迭代集合,你會看到使用std::map一個小的(可能是不可測量的)性能下降

地圖用於通過其鍵訪問值。 如果你從不這樣做,那么map對於容器來說是一個糟糕的選擇。

如果你沒有修改vector<pair<string,string> > - 只是反復迭代它 - 你將通過使用map降低性能。 這是因為典型的map是用二進制對象樹組織的,每個對象都可以分配在不同的內存塊中(除非你編寫自己的分配器)。 另外, map每個節點都管理指向鄰居對象的指針,因此也是時間和內存開銷。 但是,按鍵搜索是O(log)操作。 另一方面, vector將數據保存在一個塊中,因此處理器緩存通常會感覺更好。 在向量中搜索實際上是O(N)操作,這不是很好但可以接受。 可以使用lower_bound等函數將已排序的向量中的搜索升級到O(日志)。

這取決於您對此數據所做的操作。 如果你做了很多搜索 - 可能最好使用像unordered_map這樣的散列容器,因為在這個容器中按鍵搜索是O(1)操作。 對於迭代,如上所述, vector更快。

可能值得替換你的pair string ,但這在很大程度上取決於你在那里持有什么以及如何訪問容器。

答案取決於您對這些數據結構的處理方式以及它們的大小。 如果你的std::vector<std::pair<std::stringm std::string> >有數千個元素,並且你一直在搜索第first元素,那么使用std::map<std::string, std::string>可以提高性能(您可能需要考慮使用std::unordered_map<std::string, std::string>來代替此用例)。 如果你的向量相對較小並且你不想過於頻繁地將元素插入中間,那么使用向量可能會更快。 如果你只是迭代元素,矢量比地圖快很多:迭代並不是他們的力量之一。 地圖擅長查找,假設元素的數量不是很小,因為否則對矢量的線性搜索仍然更快。

確定花費時間的最佳方法是對代碼進行分析:在預先花費時間的情況下,通常並不完全清楚。 通常,可疑的熱點實際上沒有問題,其他區域顯示出意想不到的性能問題。 例如,您可能會將對象傳遞給我的值,而不是通過引用傳遞給某個不起眼的地方。

如果您的使用模式在執行任何查找之前執行了許多插入,那么您可能會受益於實現“惰性”映射,其中元素按需排序(即,當您獲取迭代器,執行查找等)。

由於C ++在一個線性內存中說std::vector排序項,所以首先它分配一個具有初始容量的內存塊,然后當你想要將新項插入vector時,它將檢查它是否有更多空間,如果不是將分配一個具有更多空間的新緩沖區,將所有項目復制構造到新緩沖區中,然后刪除源緩沖區並將其設置為新緩沖區。

當你剛開始將項目插入vector並且你有很多項目時,你會遇到太多的重新分配,復制構造和析構函數調用。

為了解決這個問題,如果你現在計算輸入項(不精確但通常的長度),你可以為向量reserve一些內存,避免重新分配和所有事情。 如果您不知道大小,可以使用像std::list這樣的集合,永遠不會重新分配其內部項目。

暫無
暫無

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

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