鉴于以下linq查询,哪一个更高性能'?

时间:2013-04-22 04:59:03

标签: c# .net linq parallel-processing

鉴于以下for each语句中包含一些linq,我需要以Distinct的形式遍历列表。所以我有很多地方可以添加Distict()语句。

有人可以解释我应该使用哪种解决方案以及为什么?我对使用AsParallel()非常陌生,所以我不确定要采用哪种解决方案..

现有代码(缺少并需要Distinct()

foreach (var phrase in (something != null 
    ? ListOne.AsParallel() 
    : ListTwo.AsParallel()))
{
 ... // irrelevant for this question 
}

选项1:区分整个结果。

foreach (var phrase in (something != null 
    ? ListOne.AsParallel() 
    : ListTwo.AsParallel()).Distinct())
{
 ... // irrelevant for this question 
}

我觉得这会回复太多信息(最初)。

选项2:在并行

之前区分每个列表
foreach (var phrase in (something != null 
    ? ListOne.Distinct().AsParallel() 
    : ListTwo.Distinct().AsParallel()))
{
 ... // irrelevant for this question 
}

选项3:在并行

之后区分每个列表
foreach (var phrase in (something != null 
    ? ListOne.AsParallel().Distinct() 
    : ListTwo.AsParallel().Distinct() ))
{
 ... // irrelevant for this question 
}

是的 - 我可以使用秒表创建自己的测试代码等等。但我不是那么多指标,而是更多的理论(关于我应该做什么......因为XXXXX)。

**在此变为主观问题并关闭之前,请考虑您的答案。 **其次,我理解这里的穿孔很小..所以只是为了迭代,我不是那么担心 - 实际 - 性能差异,而是理论差异。

1 个答案:

答案 0 :(得分:4)

选项1和3将产生相同的执行路径。在这两种情况下,Distinct的结果都会调用AsParallel。这意味着问题实际上归结为在AsParallel()之前或之后调用Distinct是否更好。

基于ParallelEnumerable.Distinct()的实际实现,它只使用非并行Enumerable.Distinct我会说它在你的情况下完全没有区别,因为你这里实际上没有查询。您只是区分现有列表。您可能根本不应该在这里使用AsParallel

如果您确实有查询,最好最后调用Distinct,因为它不会并行执行,并且如果在较小的集合上执行可能会更快 - 已经过滤掉了在平行下。但这部分答案需要验证实际的基准测试。