天天看點

ToList()所帶來的性能影響

原文:

ToList()所帶來的性能影響

    前幾天優化師弟寫的代碼,有一個地方給我留下很深刻的印象,就是我發現他總是将PLINQ的結果ToList<>(),然後再傳回給主程式,對于這一點我十分不解,于是去問他是什麼原因,得到的答案很幽默:因為習慣。

    有時候對于方法的不甚了解加上“習慣”,往往是程式性能和穩定性終結者,就拿這個Case來說吧,原始代碼如下:

var query = from cr in LCRNormal.AsParallel()

let listId = from crt in LCRNormal

group crt by crt.KeyValue into m

select m.Max(n => n.DBID)

where listId.Contains(cr.DBID) && !cr.IsRegularRecord && cr.Status != 3

select new ComputingResultForTemp()

{

KeyValue = cr.KeyValue,

DBID = cr.DBID,

Status = cr.Status

};

    經過以上PLINQ後,泛型清單中大概還剩下60萬至100萬條資料,然後我們這位師弟做了兩個很“施瓦辛格”的動作:ToList<>()和Count(),測試程式運作在一台4*2G HZ,12GB記憶體的伺服器上,竟然跑了2天多!我覺得正式這兩個方法導緻了程式性能的降低,為了  确定我的判斷,我分别在以上代碼、ToList<>()和Count()周圍加上了StopWatch計時器,然後将結果以文本的形式輸出:

    ● 100萬資料PLINQ:

==========3/26/2011 01:34:31 PM ===========

**(GetDeletedRecords)Start PLINQ(LINQ FITTER)

==========3/26/2011 01:38:38 PM ===========

**(GetDeletedRecords)Finish PLINQ (LINQ FITTER)

   ●  80萬資料ToList <>():

==========3/26/2011 03:22:10 PM ===========

**(GetDeletedRecords)Start Get List

●  80萬資料Count():

==========3/28/2011 02:12:09 PM ===========

**(GetDeletedRecords)Start Get Count

==========3/28/2011 08:50:55 PM ===========

** (GetDeletedRecords)Finish Get Count

    日志格式是這樣:任務開始時輸出目前時間和“Start”,任務結束時輸出“Finish”,當從日志中可以看出,PLINQ的效率還是很高的,隻運作了幾分鐘;ToList<>()方法在運作了1天多後人為終止,是以隻有Start沒有Finish;Count()方法也運作了6小時多。

    是以最終優化方案很簡單,去掉了ToList和Count,程式從幾天的運作時間一下縮短到幾個小時。

繼續閱讀