我最近在我的公司看到了一种新的趋势,我们通过简单的LINQ转换将IEnumerable转换为字典,如下所示:
enumerable.ToDictionary(x=>x);当集合上的操作是包含/访问时,我们主要是这样做的,显然,在这种情况下,字典具有更好的性能。
但我意识到,将可枚举转换为字典有其自身的代价,我想知道它是从什么时候开始实现盈亏平衡的--也就是说,IEnumerable ToDictionary /access的性能等于 + access/contains.。
好的,我可能补充说,没有数据库访问权限,枚举可能是从数据库查询创建的,这就是它,枚举也可以在此之后进行编辑。
另外,想知道键的数据类型对性能有什么影响呢?
一般情况下,查找可能是2-5次,但有时也是如此。但我已经看到了这样的情况:
var element=Enumerable.SingleorDefault(x=>x.Id);
//do something if element is null or return一本字典:
if(dictionary.ContainsKey(x))
//do something if false else return这件事已经困扰我很长一段时间了。
发布于 2011-09-07 08:55:17
字典的性能与IEnumerable的比较
当正确使用Dictionary时,读取速度总是更快(除非数据集非常小,例如10项)。创建它时可能会有开销。
给定m作为对同一个对象执行的查找量(它们是近似的):
m * O(n)).
IEnumerable的性能(从干净列表创建):O(mn)
(O(n)).:Dictionary:O(n) + O(1m)或O(m + n)
Dictionary:O(n) + O(1m))
通常可以看出,Dictionary在m > 1时获胜,IEnumerable在m = 1或m = 0时获胜。
一般来说,你应该:
当对同一数据集进行多次查找时,
Dictionary;在进行查找时,IEnumerable;当数据集太大,无法放入内存时,IEnumerable。请记住,SQL表可以像使用pressure.一样使用,因此您可以使用它来抵消内存
进一步考虑
Dictionary使用GetHashCode()来组织内部状态。Dictionary的性能与哈希代码有两种强烈的关联。
GetHashCode() --每次添加、查找或删除项时都会导致开销。O(1)查找GetHashCode()。大多数内置的.Net类型(特别是值类型)都有非常好的散列算法。但是,对于类似列表的类型(例如字符串),GetHashCode()具有O(n)性能,因为它需要遍历整个字符串。因此,您的字典的性能确实可以被看作是(其中M是一个有效的GetHashCode()):O(1) + M。
发布于 2011-09-07 08:26:13
这取决于..。
IEnumerable多长时间?
访问IEnumerable会导致数据库访问吗?
它多久被访问一次?
最好的做法是做实验和分析。
发布于 2011-09-07 08:24:58
如果您经常通过某个键搜索集合中的元素,那么字典会更快,因为或者它的基于哈希的集合和搜索有时更快,否则如果不通过集合进行大量搜索--转换是不必要的,因为转换的时间可能比集合中的一两次搜索要大,
https://stackoverflow.com/questions/7330802
复制相似问题