当我尝试使用Plinq(Parallel linq)进行对象收集时,我得到了一个基本问题,我观察到Plinq Vs正常运行在执行时间方面没有太大差异。任何人都可以检查我的代码,并告诉我为什么会发生这种情况。我在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模式下的MilliSeconds
经过的时间:6:68秒:普通模式下的毫秒数
答案 0 :(得分:1)
Where()返回IEnumerable,但不会导致查询被评估。您需要明确评估答案(例如,使用ToList())。
启动线程时需要考虑一些开销,因此您的工作负载必须花费足够的时间来执行,以便您可以发现差异。除非评估标准昂贵,否则过滤可能不适合列入内存的列表。
使用System.Diagnostics.Stopwatch类进行测量;它具有更好的精度。