【发布时间】:2014-04-14 22:51:29
【问题描述】:
我有以下简单的类:
public class MyClass{
public long StartRange { get; set; }
public long EndRange { get; set; }
public int Id { get; set; }
}
我需要在内存缓存中存储很多,10^5 到 10^6。在应用程序启动时将对该缓存进行一次写入和多次读取。这个缓存会在一个 ASP.NET 环境中被访问,所以线程很多。
我需要在此缓存中查找我的值介于 StartRange 和 EndRange 之间的行。范围不重叠,但可能是稀疏的。我发现执行此操作的最简单方法如下:
public MyClass Lookup(long value){
return _set.FirstOrDefault(d => value >= d.StartRange && value <= d.EndRange);
}
我已经尝试过将集合存储为IOrderedEnumerable<T> 和SortedSet<T>。 SortedSet 快了一个数量级。 HashSet<T> 比 SortedSet 稍微快一点。任何关于使用最有效的集合类或更好的查找的建议将不胜感激。
【问题讨论】:
-
尝试查看this article。它很好地解释了每个集合类的工作原理。
-
使用
struct而不是class(并使其不可变)。 10^6 乘以 ( 8 + 8 + 4 ) 字节为 20 MB,但类是两倍。然后将它们存储在排序数组中并使用二进制搜索,如下所述。 -
@KrisVandermotten:我很难找到有关对象引用的空间要求的信息。您能否为评论中的“课程数量增加一倍”部分提供引用?
-
@StriplingWarrior msdn.microsoft.com/en-us/magazine/cc163791.aspx 上的文章已经很老了,细节可能已经改变(例如支持 64 位),但请查看标题为“ObjectInstance”的部分。它归结为:堆上的对象有内存管理和垃圾收集的开销,支持继承等。结构没有这个开销。
标签: c# search optimization collections