【问题标题】:Does let clause in parallel linq force the parallel evaluation?并行 linq 中的 let 子句是否强制并行评估?
【发布时间】:2013-09-26 18:45:01
【问题描述】:

在 xamarin iOS 网站上有以下并行 linq 示例。

from item in items.AsParallel ()
   let result = DoExpensiveWork (item)
   select result;

这不是写的吗

from item in items.AsParallel ()
   select DoExpensiveWork (item);

或者 let 子句有什么原因吗?这是否迫使它被并行评估?

【问题讨论】:

  • 输出是一样的,两个查询并行执行也没有区别。

标签: .net linq


【解决方案1】:

我们看一下生成的代码(当然是反编译的):

private static void WithLet(IEnumerable<int> items)
{
  ParallelEnumerable.Select(ParallelEnumerable.Select(ParallelEnumerable.AsParallel<int>(items), item =>
  {
    var local_0 = new
    {
      item = item,
      result = Program.DoExpensiveWork(item)
    };
    return local_0;
  }), param0 => param0.result);
}

private static void WithoutLet(IEnumerable<int> items)
{
  ParallelEnumerable.Select<int, object>(ParallelEnumerable.AsParallel<int>(items), (Func<int, object>) (item => Program.DoExpensiveWork(item)));
}

正如我们所见,这两种方法的唯一区别是创建了一个中间局部变量。对该局部变量的赋值不会改变程序的行为。

为了更具体地回答您的问题,强制并行执行的代码实际上是对ParallelEnumerable.AsParallel 的调用。 LINQ 查询仅在枚举时执行,因此按理说是 IEnumerable&lt;&gt; 的生成器指定它是否并行执行。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 2013-03-24
    • 2011-03-08
    • 1970-01-01
    • 2012-02-03
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多