C# 并行Linq到对象集合
当我尝试将Plinq(并行linq)用于对象收集时,我遇到了一个基本问题,我发现Plinq与正常操作在执行时间方面没有太大区别。任何人都可以检查我的代码并告诉我为什么会这样。我已经在i7处理器上运行了这段代码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()
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类进行测量;它有更好的精度
var query1
,这两者都是相同的。这是正确的。您应该测量,其中
(使用秒表类)我希望您的大部分时间都在分配var query1
,这两个变量都是相同的。这是正确的。您应仅测量,其中(使用秒表类)