我经常使用LINQ扩展方法ToDictionary,但我想知道它的性能。没有参数来定义字典的容量,对于100k或更多条目的列表,这可能会成为一个问题:
IList<int> list = new List<int> { 1, 2, ... , 1000000 };
IDictionary<int, string> dictionary = list.ToDictionary<int, string>(x => x, x => x.ToString("D7"));实现是否实际接受list.Count并将其传递给字典的构造函数?或者字典的大小调整足够快了,所以我真的不用担心了?
发布于 2012-05-29 22:51:20
实现是否实际接受list.Count并将其传递给字典的构造函数?
不是的。根据ILSpy的说法,实现基本上是这样的:
Dictionary<TKey, TElement> dictionary = new Dictionary<TKey, TElement>(comparer);
foreach (TSource current in source)
{
dictionary.Add(keySelector(current), elementSelector(current));
}
return dictionary;如果你profile你的代码,并确定ToDictionary操作是你的瓶颈,那么基于上面的代码创建你自己的函数是微不足道的。
发布于 2012-05-29 22:43:19
实现是否实际接受list.Count并将其传递给字典的构造函数?
这是一个实现细节,对你来说不应该很重要。
还是字典的大小调整够快了,所以我真的不用担心了?
嗯,我不知道。只有您知道这是否真的是应用程序中的瓶颈,以及性能是否可接受。如果你想知道它是否足够快,编写代码并计时。就像Eric Lippert常说的那样,如果你想知道两匹马有多快,你是让它们比赛,还是在互联网上随便问陌生人哪一匹更快?
也就是说,我真的很难想象这会成为任何实际应用程序的瓶颈。如果向字典中添加条目是应用程序中的瓶颈,那么您做错了什么。
发布于 2012-05-29 22:45:17
我不知道如何调整字典的大小,但是使用dotPeek.exe检查实现表明实现没有使用列表长度。
这段代码主要做的是:
创建新的dictionary
如果您发现这是一个瓶颈,那么创建您自己的扩展方法ToDictionaryWithCapacity将是微不足道的,它可以在不迭代整个东西的情况下实际计算其长度。
刚刚扫描了Dictionary实现。基本上,当它开始填满时,内部列表通过将其大致加倍为接近质数来调整大小。所以这种情况不应该发生得太频繁。
https://stackoverflow.com/questions/10801352
复制相似问题