2012-01-05 71 views
1

當我用Plinq(並行linq)嘗試對象集合時,我得到了一個基本問題,並且我觀察到Plinq Vs正常操作在執行時間方面沒有太大差異。任何人都可以檢查我的代碼,並告訴我爲什麼發生這種情況。我已經在i7處理器中運行此代碼。並行Linq到對象集合

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秒:毫秒模式相同常


經過時間:6:68秒:毫秒正常模式

+2

我希望你的大部分時間都在分配'var query1',這對於兩者都是相同的。 – 2012-01-05 15:48:00

+0

這是正確的。您應該只測量「Where」(使用秒錶類) – 2012-01-05 15:53:20

回答

1
  • Where()返回IEnumerable並且不會導致查詢被評估。您需要明確評估答案(例如,使用ToList())。

  • 在啓動必須考慮的線程時會有一些開銷,所以您的工作負載必須有足夠的時間來執行,以便您可以觀察到不同之處。過濾器可能不足以放入內存中,除非評估標準昂貴。

  • 使用System.Diagnostics.Stopwatch類進行測量;它有更好的精度。