2012-07-18 58 views
2

除了滾動我自己的集合,我想知道哪些現有(.NET 3.5)集合和IDictionary使用最少的內存量。最少記憶密集型收藏?

我目前使用

  • 列表<INT>,在這裏我只是添加項目,後來迭代它。
  • 詞典< int,int >,其中我只設置並獲取鍵值對。

注:我正在做成熟的優化。

編輯:我不知道大小,但大約,字典將增長到約789679元素和列表將包含平均10-20元素。

+0

有多少元素(平均)?你事先知道尺碼嗎? – 2012-07-18 08:21:51

+0

我已經更新了這個問題。 – Howie 2012-07-18 08:27:35

回答

2

您可以在CPU週期的成本節省一些內存:

int[] data; 
{ 
    List<int> temp = ....; 
    // fill the list 
    data = temp.ToArray(); 
} 

當你知道的元素數事先就可以消除了幾步。

字典不容易替換。

+0

當元素數量增長時,我似乎無法找到任何關於Dictionary或Dictionary-like類(Hashtable,專業字典......)的空間效率的信息。 – Howie 2012-07-18 08:32:55

+0

您可以使用排序後的數組替換字典,然後執行BinarySearch。根據密鑰的複雜性,它可能很簡單。 – xanatos 2012-07-18 08:33:20

+0

由於我的問題的性質,我可能可以用預先分配的整數數組替換字典。 – Howie 2012-07-18 09:22:30

2

索引始終是空間和性能之間的折衷。列表和字典接口的最少內存密集型實現始終是平面陣列。當然,這意味着你的字典性能將會是可怕的,並且插入性能(對於任一個)將是

對於10-20個元素的列表,坦率地說:甚至不要調查。只需使用List<T>即可。對於這樣一個極其瑣碎的數據量來說,沒有明智的問題需要回答。

即使789679也不是很大。然而,如果你的重點是內存,那麼簡單地預先排序數據可能是你最好的選擇。然後,您可以使用二進制搜索來查找項目。不如哈希表實現快,但內存少得多:只有2個數組(或一組元組)。換句話說:使用SortedList<TKey,TValue>