C# 哪个LINQ表达式更好?
我想知道以下哪种LINQ表达式更好(特别是在性能方面) 注:C# 哪个LINQ表达式更好?,c#,performance,linq,search,C#,Performance,Linq,Search,我想知道以下哪种LINQ表达式更好(特别是在性能方面) 注: 搜索关键字的长度通常在50左右 关键字的长度通常在3左右 这个方法大约被调用100000次 这个 keywords.All(a => SearchKeywords.Contains(a)); 还是这个 keywords.Except(SearchKeywords).None(); 注意:.None()是我的扩展方法,它只返回!。任何() 有没有更好的方法写这个 除之外的将快大约一百万倍,因为它使用哈希表来查找设置差异,从
- 搜索关键字的长度通常在50左右
- 关键字的长度通常在3左右
- 这个方法大约被调用100000次
keywords.All(a => SearchKeywords.Contains(a));
还是这个
keywords.Except(SearchKeywords).None();
注意:.None()是我的扩展方法,它只返回!。任何()
有没有更好的方法写这个
除之外的
将快大约一百万倍,因为它使用哈希表来查找设置差异,从而提供O(n)性能
包含/所有组合必须对关键字中的每个元素搜索关键字,进行简单的线性搜索,因此我们谈论的是O(n²)性能(实际上n*m
,但您给出的数字在相同的范围内,请原谅我键入指数)
更新:如预期,除非您显式创建哈希集
当然,除非SearchKeywords
已经是HashSet
,正如flq在评论中非常正确地指出的那样
²至少如果我们讨论的是一个IEnumerable
,它使用LINQ to objects标准实现。一个IQueryable
理论上可以检测到这一点,并以它喜欢的任何方式实现它。不确定,但我认为
keywords.Except(SearchKeywords).None();
比上一个更快,因为它可能需要扫描一次SearchKeywork集合。如果SearchWords是本地集合,则第一个选项可读性更高,并且与LINQ to SQL兼容
第二个选项与Linq To SQL不兼容。那么,您的性能度量值是怎么说的?您应该在这里添加AsParallel。我想3个项目的并行是Neutral。无SearchKeywords是一个哈希集,我想除了必须首先构造它之外。@flq:非常正确。我更新了答案和基准以反映这一点。你甚至可以将第一个重写为关键字.All(SearchWords.Contains)