至少在某種程度上,BCL集合似乎考慮了分頁問題。他們也考慮CPU緩存問題(這在某些方面是重疊的,因爲內存的局部性會以不同的方式影響兩者)。
請考慮Queue<T>
將陣列用於內部存儲。在純粹的隨機訪問條件下(也就是說,從不存在尋呼或CPU緩存刷新的任何代價),這是一個糟糕的選擇;隊列幾乎總是被單獨添加到一個點,並從另一個點刪除,因此內部實現作爲單個鏈接列表幾乎可以在各種方式中獲勝(就此而言,就迭代隊列而言 - 它也支持 - 在純隨機訪問情況下,鏈表不應該比數組在這方面差得多)。在基於陣列的實現比單鏈表更好的情況下,恰恰是在考慮分頁和CPU緩存時。該MS尋求的解決方案在純隨機訪問情況下更糟,但在尋呼很重要的實際情況下效果更好,因此他們正在關注尋呼的影響。
當然,從外部看並不明顯 - 不應該這樣。從外面看,我們想要一個像隊列一樣工作的東西;使內部高效是一個不同的問題。
這些問題也以其他方式得到滿足。例如,GC工作的方式可以最大限度地減少所需的分頁數量,因爲其移動對象不僅可以減少碎片,還可以減少頁面錯誤。其他集合也以實現分頁的方式比最直接的解決方案建議的頻率更少。
這只是我從我看過的東西中脫穎而出的幾件事情。我敢打賭,這些問題在.NET團隊的許多其他地方也被考慮過。與其他框架一樣。考慮到一個重要的性能問題,就是他的Java無鎖哈希表(我真的完成了對C#實現的檢查),除了無鎖併發性(整個練習的重點)之外,他們多次提到cache-lines ;而且這也是他不會拒絕的另一個表現問題!
請考慮一下,大多數藏品的大多數用途無論如何都會放在一個頁面中!
如果你正在實現自己的收藏,或者將標準收藏放到特別重要的地方,那麼這些都是你需要考慮的事情(有時候「不是問題」就足夠了,有時候不是)但這並不意味着他們從BCL中得到的東西並沒有被考慮過。
如果您正在研究需要具有幾億條條目的優先隊列,則需要付費進行調查。請注意,該文章是關於服務器場的。 – 2010-10-03 18:45:37