簡體   English   中英

.NET:通用字典的可伸縮性

[英].NET: Scalability of generic Dictionary

我正在使用Dictionary<>來存儲數以億計的物品。 是否可以安全地假設,只要服務器的內存有足夠的空間來容納我將接近O(1)從中檢索項目的這些無數物品? 當性能很重要時,我應該知道如何將通用詞典用作大緩存?

編輯:我不應該依賴默認的實現? 是什么促成了良好的散列函數?

它幾乎完全取決於你的“bazillion items”支持的哈希功能有多好 - 如果它們的哈希函數不是很好(因此導致許多沖突),你的性能會隨着字典的增長而降低。

你應該測量它並找出答案。 您就是那些了解字典確切用法的人,因此您可以測量它以確定它是否符合您的需求。

一條忠告:我過去對大字典結構進行了性能分析,發現隨着字典變得非常大,性能確實降低了。 但它似乎在這里和那里降級,而不是每次操作都一致。 我在嘗試分析哈希算法等方面做了很多工作,然后在額頭上打了一拳。 垃圾收集器變得越來越慢,因為我有這么多的實時工作集; 字典和以往一樣快,但是如果一個集合碰巧被觸發,那就是吃掉了我的周期。

這就是為什么不在不切實際的基准測試場景中進行性能測試很重要的原因; 找出你的bazillion-item字典的實際性能成本是什么,好吧,這將是關於許多與你的字典無關的東西的門控,比如在你的其余部分中發生了多少集合觸發程序,何時。

是的,您將有O(1)訪問時間。 實際上是迂腐它將恰好O(1)。 您需要確保用作鍵的所有對象都具有良好的GetHashCode實現,並且可能會覆蓋Equals。

編輯澄清:實際上,除非你能提供“完美”的哈希函數,否則你擁有的項目越多,訪問時間就越慢。

是的,無論你在“詞典”中添加了多少個對象,你都會在O(1)附近。 但是為了使Dictionary快速,你的key-objects應該提供足夠的GetHashCode實現,因為Dictionary里面使用了一個hashtable。

暫無
暫無

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

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