[英]Under what circumstances will std::unordered_map behave very slow?
我做了一些隨機測試,但我無法得出結論。
如果將1000000個整數插入到地圖和unordered_map中,則map使用的時間要大3倍。
如果插入1000000個字符串,那么map使用的時間要大2倍。
在什么情況下std :: unordered_map表現得很慢?
提前致謝。
UPD :: gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04.3)。 所有測試都沒有-O2。
碼:
a.cpp: std::map<int, int> M;
b.cpp: std::unordered_map<int, int> M;
g(i, 1, 1000000) {
M[i] = rand() % i;
}
我的測試結果:
yyhs@yyhs-Pro:~/Documents$ g++ a.cpp -o a -g --std=c++11 && time ./a
real 0m0.659s
user 0m0.653s
sys 0m0.004s
yyhs@yyhs-Pro:~/Documents$ g++ b.cpp -o b -g --std=c++11 && time ./b
real 0m0.260s
user 0m0.251s
sys 0m0.008s
yyhs@yyhs-Pro:~/Documents$ g++ a.cpp -o a -g --std=c++11 -O2 && time ./a
real 0m0.290s
user 0m0.282s
sys 0m0.008s
yyhs@yyhs-Pro:~/Documents$ g++ b.cpp -o b -g --std=c++11 -O2 && time ./b
real 0m0.081s
user 0m0.081s
sys 0m0.000s
我的問題是這些情況可能會導致std :: unordered_map變慢。
像往常一樣,這將取決於具體的實現,但這並不完全正確,標准保證std::unordered_map
將漸近地勝過std::map
。 只有不變因素會因實施而異。 std::map
的插入時間為O(log N), std::unordered_map
的平均插入時間為O(1)。 有關詳細信息,請參見n3690中的§23.4.4.1和§23.5.4。
通常, std::unordered_map
將大幅超越std::map
(如您所見),除非您有很多沖突。 您可以通過選擇放置在同一個存儲桶中的鍵來創建沖突。 這需要了解您的哈希函數以及從哈希值到存儲桶的映射,但是如果攻擊者可以控制哈希表中的鍵,那么攻擊者可以利用這些知識使程序變慢。 因此,在暴露的應用程序中使用隨機散列函數是很常見的。
在病態情況下,如果您的哈希函數選擇不當(要么很慢評估或產生許多沖突), std::map
可能會勝過std::unordered_map
。 這非常不典型。
作為次要注釋,標准庫std::unordered_map
往往是一個開放的哈希表,以滿足C ++標准關於迭代器行為的要求。 眾所周知,這對許多應用程序而言並不是最優的,並且有許多替代散列表庫可以表現得更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.