只有一个操作,C#容器的资源效率最高?

时间:2010-05-14 14:30:38

标签: c# performance containers

我经常发现自己需要对一组属性执行操作。操作可以是检查特定属性是否与集合中的任何内容匹配到单个迭代的操作。有时,在调用函数时动态生成集合,有些是使用简单的LINQ语句构建的,有时它是硬编码集合,始终保持不变。但是一个常量总是存在:该集仅存在于单个操作中且在其之前或之后没有用处

我的问题是,我的应用程序中有很多要点,这是必要的,但我在存储这些集合方面似乎非常非常不一致。其中一些是数组,一些是列表,刚才我发现了几个链表。现在,我并不特别关注的操作都不关心索引,容器大小,顺序或任何单个容器类型赋予的任何其他功能。我选择了资源效率,因为它比掷硬币更好。我想,由于数组大小已经配置并且它是一个非常基本的容器,这可能是我的最佳选择,但我认为这是一个更好的主意。或者,如果有一个更好的选择,不是出于资源效率,而是严格地认为是这种情况的更好选择,那也很好。

3 个答案:

答案 0 :(得分:6)

如果您承认这更多是关于编码一致性而不是性能或效率,我认为通常的做法是使用List<T>。它的实际后备存储是一个数组,所以你并没有真正失去太多(如果有任何明显的)容器开销。没有更多的资格,我不确定我能提供更多的东西。

当然,如果您真的不关心您在问题中列出的内容,只需将变量键入IEnumerable<T>,并且只是在填充时才处理实际容器;你消费的地方将是完全一致的。

答案 1 :(得分:2)

关于资源效率,有两个基本原则需要注意。

  • 运行时复杂性
  • 内存开销

你说索引和顺序并不重要,而且频繁的操作是匹配的。 Dictionary<T>hashtable)是此类工作的理想候选人。按键上的查找速度非常快,这对您的匹配操作非常有用。缺点是它将消耗比严格要求更多的内存。通常的负载系数大约是.8所以我们不是在谈论大幅增加或任何事情。

对于您的其他操作,您可能会发现数组或List<T>是更好的选择,尤其是在您不需要快速查找的情况下。只要您不需要在专业操作(查找,排序等)上获得高性能,那么很难超越基于数组的容器的一般资源特性。

答案 2 :(得分:0)

列表一般可能很好。它很容易理解(在文学编程意义上)并且相当有效。如果添加带有重复键的条目,则键控集合(例如Dict,SortedList)将抛出异常,但这可能不是您现在正在处理的问题。

只有当您发现自己遇到CPU时间或内存大小问题时,才应考虑提高“效率”,然后才确定是瓶颈。

无论您使用哪种方法,如果应用程序运行的时间足够长,仍会创建和删除最终将被垃圾收集的基础对象(集合或迭代器)。