【问题标题】:Least memory-intensive Collection?最少占用内存的集合?
【发布时间】:2012-07-18 16:50:41
【问题描述】:

除了滚动我自己的集合之外,我想知道现有的 (.NET 3.5) 集合和 IDictionary 使用的内存量最少。

我目前正在使用

  • List,我只在其中添加项目,然后对其进行迭代。
  • 字典,在这里我只设置和获取键值对。

注意:我正在做成熟的优化。

编辑:我事先不知道大小,但大约,字典将增长到大约 789679 个元素,并且列表将平均包含 10-20 个元素。

【问题讨论】:

  • 多少元素(平均)?你知道尺寸吗?

标签: c# .net optimization collections memory-optimization


【解决方案1】:

索引始终是空间和性能之间的权衡。列表和字典接口的内存占用最少的实现总是平面数组。当然,这意味着您的字典性能会糟糕,而插入性能(两者中的任何一个)都会更差

对于 10-20 个元素的列表,坦率地说:甚至不要调查。只需使用List<T>。对于如此微不足道的数据量,没有任何明智的问题需要回答。

即使 789679 也不大。但是,如果您的重点是内存,那么简单地对数据进行预排序可能是您最好的选择。然后,您可以使用二进制搜索来查找项目。不如哈希表实现快,但内存少得多:只有 2 个数组(或单个元组数组)。或者换句话说:使用SortedList<TKey,TValue>

【讨论】:

    【解决方案2】:

    您可以以 CPU 周期为代价节省一些内存:

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

    当您事先知道元素的数量时,您可以省去几个步骤。

    字典不是那么容易替换的。

    【讨论】:

    • 当元素数量增加时,我似乎找不到任何有关 Dictionary 或 Dictionary-like 类(Hashtable、专用字典...)的空间效率的信息。
    • 您可以用排序数组替换字典,然后执行 BinarySearch。根据密钥的复杂性,它可能很简单。
    • 由于我的问题的性质,我也许可以用预先分配的整数数组替换字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2010-10-15
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多