我要求的东西有点奇怪,但这是我的要求(这有点计算密集型,到目前为止我在任何地方都找不到)..
我需要<TKey, TValue>
大约 30 件物品的集合。但是该集合用于大规模嵌套foreach
循环,这些循环可能会严重迭代近十亿次。收集操作很简单,看起来像:
Dictionary<Position, Value> _cells = new
_cells.Clear();
_cells.Add(Position.p1, v1);
_cells.Add(Position.p2, v2);
//etc
简而言之,无非是增加了大约 30 件物品并清理了收藏。此外,这些值将在某个时候从其他地方读取。我需要按键读取/检索。所以我需要一些类似于Dictionary
. 现在,由于我试图从 CPU 中挤出每一盎司,我也在寻找一些微优化。一方面,我不需要集合在添加时检查是否存在重复项(与添加项相比,这通常会使字典变慢List<T>
)。我知道我不会将重复项作为键传递。
由于Add
方法会做一些检查,所以我尝试了这个:
_cells[Position.p1] = v1;
_cells[Position.p2] = v2;
//etc
List<T>
但是对于大约 10k 次迭代,这仍然比这样的典型实现慢了大约 200 毫秒:
List<KeyValuePair<Position, Value>> _cells = new
_cells.Add(new KeyValuePair<Position, Value>(Position.p1, v1));
_cells.Add(new KeyValuePair<Position, Value>(Position.p2, v2));
//etc
现在,在完全迭代后,这可以扩展到一个明显的时间。请注意,在上述情况下,我已按索引从列表中读取项目(这对于测试目的来说是可以的)。对我们来说,常规的问题List<T>
很多,主要原因是无法通过密钥访问项目。
简而言之,我的问题是:
是否有一个自定义集合类可以让按键访问项目,但在添加时绕过重复检查?任何第三方开源集合都可以。
或者请给我指出一个好的入门者如何从
IDictionary<TKey, TValue>
接口实现我的自定义集合类
更新:
我听从了 MiMo 的建议,List 还是更快。也许它与创建字典的开销有关。