• ToList()所带来的性能影响


    前几天优化师弟写的代码,有一个地方给我留下很深刻的印象,就是我发现他总是将PLINQ的结果ToList<>(),然后再返回给主程序,对于这一点我十分不解,于是去问他是什么原因,得到的答案很幽默:因为习惯。
        有时候对于方法的不甚了解加上“习惯”,往往是程序性能和稳定性终结者,就拿这个Case来说吧,原始代码如下:

    [c-sharp] view plain copy
     
    1. var query = from cr in LCRNormal.AsParallel()  
    2.                         let listId = from crt in LCRNormal  
    3.                                      group crt by crt.KeyValue into m  
    4.                                      select m.Max(n => n.DBID)  
    5.                         where listId.Contains(cr.DBID) && !cr.IsRegularRecord && cr.Status != 3  
    6.                         select new ComputingResultForTemp()  
    7.                         {  
    8.                             KeyValue = cr.KeyValue,  
    9.                             DBID = cr.DBID,  
    10.                             Status = cr.Status  
    11.                         };  

        经过以上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,程序从几天的运行时间一下缩短到几个小时。

  • 相关阅读:
    自定义打包工具对应的解析代码
    自定义的打包工具源码
    一种C语言实现面向对象特性的继承,多态
    buffers和cached的区别
    初识rt-thread杂记
    一种多叉树的实现,提供树形结构打印,树转表输出等功能
    关于rtsp的时间戳问题
    一种基于状态机(表)的小组件
    一种基于消息发布-订阅的观察者模式实现
    命令解析类代码重构
  • 原文地址:https://www.cnblogs.com/hedongnan/p/9513818.html
Copyright © 2020-2023  润新知