Dot-Net

性能:SortedDictionary 與 SortedSet

  • September 8, 2021

我應該保持

1.) 一個 SortedDictionary(double,struct)

2.) 還是一個普通的 Dictionary(double,struct) 加上一個 SortedSet(double)?

我只想要快速插入。我不關心檢索,因為我不會做太多查找。我需要排序的性質,因為我所做的唯一查找將是最大雙精度數或幾個最大雙精度數。

我覺得時間表現很明智 - 兩者都是一樣的,SortedSet<double>只是做了額外的工作。各位能確認一下嗎?

我不知道的部分是是否保持排序,SortedDictionary僅圍繞鍵(雙打)移動,還是鍵和值都移動。在後一種情況下,2.) 將優於 1.),不是嗎?

此外,還不清楚SortedDictionary內部是如何實現的。Sortedset是經過驗證的紅黑樹。

SortedDictionary<K, V>是要走的路。不僅因為它是適合您使用的正確結構,而且即使在性能和維護方面它也會更好。


我只想要快速插入

  1. 在第二種情況下,您必須同時插入Dictionary<K, V>SortedSet<K>。這是兩個插入(一個 O(1) 和另一個 O(log n))。我希望它比單次插入SortedDictionary<K, V>(O(log n)) 慢。
  2. SortedDictionary<K, V>在內部實現為SortedSet<KeyValuePair<K, V>>. 的Key部分進行比較KeyValuePair<K, V>。因此,如果您對 的表現感到滿意SortedSet<T>,那麼就不應該回頭。

sorteddictionary 僅圍繞鍵(雙精度)或鍵和值移動

**這顯然是微優化。**這只是移動幾個額外字節的問題,這無關緊要。

目前尚不清楚 sorteddictionary 是如何在內部實現的。Sortedset 是經過驗證的紅黑樹。

SortedDictionary<K, V>在內部實現為SortedSet<KeyValuePair<K, V>>. 的Key部分進行比較KeyValuePair<K, V>它是一棵紅黑樹。所以這也是被證明的表演者……


另請注意,這SortedDictionary<K, V>將減少記憶體,並導致更快的刪除和列舉。Dictionary<K, V>/SortedSet<K>混合方法將為您提供更快的查找,但它必須在列舉期間為字典中的每個鍵查找相應的值部分。這會變慢。


**警告:**當我寫以上內容時,我沒有閱讀您的評論!

我使用的結構有點重~100字節

如果您可以將其更改為類,請執行此操作。如果您的應用程序對性能至關重要,那麼移動大約 100 個字節不會很好。

我製作了一個快速而骯髒的Dictionary<K, V>/SortedSet<K>混合結構並對其進行了測試。

  • 實際上,對於 100 字節的結構,它在插入時更快(快兩倍多)。當然會有懲罰(誰會創建一個 100 字節的結構?)。
  • 當我將其更改為 class 時,它們都給出了相同的插入性能。
  • 當我縮小結構的大小時,即使這樣插入性能也是相當的。

所以我的建議是切換到一個類並使用SortedDictionary<K, V>. 如果您堅持使用結構,那麼Dictionary<K, V>/SortedSet<K>會更好。好 q 和 +1。

引用自:https://stackoverflow.com/questions/21507015