簡體   English   中英

在什么情況下std :: unordered_map表現得很慢?

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

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