C#字典性能

5

我正在使用字典来存储数据,并将其缓存。 我希望通过限制字典<>的大小(无论是大小还是条目数),以避免服务器内存问题,并获得良好的性能。
最佳方法是什么?是否应该考虑其他类而不是字典?

5个回答

5

为了实现良好的性能,您不需要限制字典的大小。

正如文档所说:

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


2
如果允许字典无限增长,可能会使用完所有可寻址的内存。根据硬件不同,在此之前可能会因为交换而出现性能问题。 - Malcolm Post

2

除了上述类之外,您还可以选择其他类,例如

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

有一篇非常好的文章在MSDN上描述了大多数集合类的优缺点

如果您不满意这些类所提供的内容,则可以选择自己的集合类或设计自己的自定义字典

您需要从IDictionary接口继承自定义字典,并编写其他类/接口或完全从头编写。

以下是MSDN上Dictionary class的签名。

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

我不需要排序。对我来说,字典很好用,因为我可以通过键获取值。我的主要担忧是字典可能会增长到什么程度。 - derek
我刚刚给了你更多选择。为什么不派生出自己的字典,并用你喜欢的规则来覆盖它的增长规则呢? - Asad
很好的链接。看起来我需要创建一个自定义类。 - derek
只是好奇...当达到限制时应该发生什么?静默丢弃、抛出异常、删除第一个缓存项、删除最长时间未被访问的项等等?对于删除第一个缓存项,使用自定义队列。对于未被访问的项,您需要跟踪该时间等等。您还可以考虑使用内置的缓存机制。 - Nelson Rothermel
你上面回答中的“选择集合类”链接在末尾附近有以下引用:“SortedDictionary泛型类提供比Dictionary泛型类更快的查找。”我不认为这是正确的。Dictionary是O(n)。SortedDictionary是O(log n)。请参见此处 - Wes

1
您需要创建一个继承自Dictionary类的自定义类。覆盖Add和setItem方法以限制添加对象时的条目数量。

1

没有过期策略的缓存就像内存泄漏一样。

(抱歉,由于我不知道谁最先说过这句话,所以未标明出处。)


缓存具有非滑动过期策略和依赖项,只需确保它不会在该过期窗口内变得太大即可。 - derek

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

大小会是可变的,所以它的增长是我的主要关注点。由于它将存储在服务器缓存中,我想限制最大容量。这将成为Web应用程序的一部分。 - derek
指定初始大小不限制大小。 - Rolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接