【问题标题】:C# Dictionary PerformanceC# 字典性能
【发布时间】:2011-02-14 05:52:00
【问题描述】:

我正在使用字典来存储数据,并将缓存它。我想避免服务器内存问题,并通过限制 Dictionary 的大小(无论是大小还是条目数)来获得良好的性能。
这样做的最佳方法是什么?除了字典,我还应该考虑其他课程吗?

【问题讨论】:

    标签: c# asp.net dictionary


    【解决方案1】:

    您无需限制字典的大小即可获得良好的性能。

    正如文档所说:

    使用其键检索值是 非常快,接近 O(1)

    【讨论】:

    • 如果您允许字典无限增长,您可以使用所有可寻址内存。取决于硬件,您可能会也可能不会因为在此之前进行交换而遇到性能问题。
    【解决方案2】:

    您还可以选择其他几个类,例如

    您可以通过查看 System.Collections.Generic 命名空间来查看选项。

    他们是一篇非常好的帖子,描述了 MSDN 上所有大多数集合类的优缺点

    如果您对这些课程提供的内容不满意,您可以选择自己的收藏课程或自行设计custom Dictionary。

    您将需要从 IDictionary 接口和其他类/接口继承您的自定义字典,或者可以从头开始编写。

    这是 Dictionary class 在 MSDN 上的签名

    [SerializableAttribute]
    [ComVisibleAttribute(false)]
    public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
        ICollection<KeyValuePair<TKey, TValue>>,
        IEnumerable<KeyValuePair<TKey, TValue>>, 
        IDictionary, ICollection, IEnumerable,
        ISerializable, IDeserializationCallback
    

    【讨论】:

    • 我不需要排序。字典对我很有效,因为我可以按键获取值。我主要关心的是字典可能增长到的大小。
    • 我刚刚给了你更多的选择。为什么不导出您自己的字典和overright 它的增长规则与您喜欢的那些?
    • 很好的链接。看来我必须创建一个自定义类。
    • 只是好奇...当达到限制时会发生什么?静默drop、抛出异常、移除第一个缓存的item、移除最长时间没有被访问的item等等?要删除第一个缓存项,请使用自定义队列。对于没有被访问过的项目,你需要跟踪那个时间等。你可能还想考虑使用内置的缓存机制。
    • 上述答案中的“选择集合类”链接在结尾处有以下引用:“SortedDictionary 泛型类提供比 Dictionary 泛型类更快的查找。”。我不认为这是真的。字典是 O(n)。排序字典是 O(log n)。见here。
    【解决方案3】:

    您需要创建自己的继承自 Dictionary 类的类。覆盖 Add 并设置 Item 方法以限制添加对象时的条目数。

    【讨论】:

      【解决方案4】:

      “没有过期策略的缓存只是内存泄漏。”

      (抱歉,不知道是谁先说的。)

      【讨论】:

      • 缓存确实有一个不可滑动的过期策略和一个依赖项,只是想确保它在过期窗口内不会变得太大。
      【解决方案5】:

      要记住的一点是,当您初始化 Dictionary 时,您可以设置初始容量。如果您知道您的列表有多大,请将其设置为正确的大小,您将不会有任何“浪费”的空间。如果您不指定容量,它将设置默认的起始容量并根据需要调整大小/增长,这会影响性能。

      【讨论】:

      • 尺寸是可变的,所以它的增长是我主要关心的。我想限制最大容量,因为它将存储在服务器的缓存中。这将是 Web 应用程序的一部分。
      • 指定初始大小不会限制大小。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2015-10-12
      • 2011-03-19
      • 2011-08-10
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多