并行 Linq to Object 集合

Parallel Linq to Object collection

提问人:Justin Mathew 提问时间:1/5/2012 最后编辑:MyrtleJustin Mathew 更新时间:2/3/2012 访问量:886

问:

当我尝试使用Plinq(并行linq)进行对象收集时,我遇到了一个基本问题,我观察到Plinq与正常操作在执行时间方面没有太大差异。任何人都可以检查我的代码并告诉我为什么会这样。我已经在 i7 处理器中运行了这段代码。

class Program
{
    static void Main(string[] args)
    {
        new Program().Plinq();
        new Program().linq();
        Console.ReadLine();
    }

    void Plinq()
    {

        DateTime startTime = DateTime.Now;

        var query1 = (from port in new XpressEntities().Portfolios.Take(1000000)
                      select new port { PortId = port.PORT_ID, CFAC = port.CFAC }).ToList<port>();

        query1.AsParallel().Where(e => e.PortId == 0);
        TimeSpan ts = DateTime.Now.Subtract(startTime);
        Console.WriteLine("Time Elapsed: {0} Seconds:MilliSeconds in Paralel mode", ts.Seconds + ":" + ts.Milliseconds);

    }

    void linq()
    {

        DateTime startTime = DateTime.Now;

        var query1 = (from port in new XpressEntities().Portfolios.Take(1000000)
                      select new port { PortId = port.PORT_ID, CFAC = port.CFAC }).ToList<port>();

        query1.Where(e => e.PortId == 0);
        TimeSpan ts = DateTime.Now.Subtract(startTime);
        Console.WriteLine("Time Elapsed: {0} Seconds:MilliSeconds in Normal mode", ts.Seconds + ":" + ts.Milliseconds);

    }

}
class port
{
    public int PortId { get; set; }
    public string CFAC { get; set; }
}

以上代码的结果是

运行时间:6:411 秒:Paralel 模式下的毫秒


运行时间:6:68 秒:正常模式下的毫秒

C# LINQ 并行处理 PLINQ

评论

2赞 Dark Falcon 1/5/2012
我希望你的大部分时间都在分配上,这对两者来说都是相同的。var query1
0赞 Gert Arnold 1/5/2012
没错。您应该测量唯一的(使用 Stopwatch 类)Where

答:

1赞 sga101 2/3/2012 #1
  • Where() 返回一个 IEnumerable,并且不会导致正在计算查询。您需要明确评估答案(例如,使用 ToList())。

  • 启动线程时必须考虑一些开销,因此您的工作负载必须花费足够的时间来执行,以便您可以观察到差异。在适合内存的列表中进行筛选可能还不够,除非评估条件的成本很高。

  • 使用 System.Diagnostics.Stopwatch 类进行测量;它具有更好的精度。