Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行Linq到对象集合_C#_Linq_Parallel Processing_Plinq - Fatal编程技术网

C# 并行Linq到对象集合

C# 并行Linq到对象集合,c#,linq,parallel-processing,plinq,C#,Linq,Parallel Processing,Plinq,当我尝试将Plinq(并行linq)用于对象收集时,我遇到了一个基本问题,我发现Plinq与正常操作在执行时间方面没有太大区别。任何人都可以检查我的代码并告诉我为什么会这样。我已经在i7处理器上运行了这段代码 class Program { static void Main(string[] args) { new Program().Plinq(); new Program().linq(); Console.ReadLine()

当我尝试将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; }
}
类程序
{
静态void Main(字符串[]参数)
{
新程序().Plinq();
新程序().linq();
Console.ReadLine();
}
void Plinq()
{
DateTime startTime=DateTime.Now;
var query1=(从新xpressenties().portfolions.Take中的端口)
选择新端口{PortId=port.port_ID,CFAC=port.CFAC});
query1.AsParallel(),其中(e=>e.PortId==0);
TimeSpan ts=日期时间.Now.Subtract(开始时间);
WriteLine(“经过的时间:{0}秒:并行模式下的毫秒”,ts.Seconds+“:”+ts.ms);
}
void linq()
{
DateTime startTime=DateTime.Now;
var query1=(从新xpressenties().portfolions.Take中的端口)
选择新端口{PortId=port.port_ID,CFAC=port.CFAC});
查询1.Where(e=>e.PortId==0);
TimeSpan ts=日期时间.Now.Subtract(开始时间);
WriteLine(“经过的时间:{0}秒:正常模式下的毫秒”,ts.Seconds+“:”+ts.ms);
}
}
类端口
{
公共int端口{get;set;}
公共字符串CFAC{get;set;}
}

上述代码的结果为

并行模式下经过的时间:6:411秒:毫秒


正常模式下经过的时间:6:68秒:毫秒
  • Where()返回IEnumerable,并且不会导致对查询求值。您需要明确地评估答案(例如,使用ToList())

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

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

      • Where()返回IEnumerable,并且不会导致对查询求值。您需要明确地评估答案(例如,使用ToList())

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

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


      我希望您的大部分时间都在分配
      var query1
      ,这两者都是相同的。这是正确的。您应该测量
      ,其中
      (使用秒表类)我希望您的大部分时间都在分配
      var query1
      ,这两个变量都是相同的。这是正确的。您应仅测量
      ,其中
      (使用秒表类)