Parallel Linq to Object collection

本文关键字:collection Object to Linq Parallel | 更新日期: 2023-09-27 18:19:36

当我尝试使用Plinq(Parallel 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秒:正常模式下的毫秒

Parallel Linq to Object collection

  • Where()返回一个IEnumerable,不会导致正在计算的查询。您需要明确地评估答案(例如,使用ToList())。

  • 启动线程时会有一些开销,必须考虑到这一点,因此您的工作负载必须花费足够的时间来执行,这样您才能观察到差异。除非评估标准的成本很高,否则在内存中适合的列表中筛选可能不够。

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