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
                        };

query.ToList<ComputingResultForTemp>();

  

    经过以上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,改用其他方法代替,程序从几天的运行时间一下缩短到几个小时。


本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2011/05/10/2041822.html,如需转载请自行联系原作者

相关文章
|
11月前
|
SQL Java API
for、foreach、stream 哪家的效率更高,你真的用对了吗?
昨天在《SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?》一文中,有同学指出Stream在数据量不庞大的情况,效率不如for循环。
|
6天前
|
存储 JavaScript 前端开发
`forEach()`方法和`map()`方法哪个执行效率更高?
`forEach()`方法和`map()`方法哪个执行效率更高?
|
3月前
去重Cube的优化实践问题之直接计算去重类指标的方法具体问题如何解决
去重Cube的优化实践问题之直接计算去重类指标的方法具体问题如何解决
|
5月前
|
数据库
ArrayList的contains()方法的性能问题及优化方法
ArrayList的contains()方法的性能问题及优化方法
67 0
|
4月前
|
JavaScript 前端开发 测试技术
Map 和 Object 在处理大量数据时性能差异
Map 和 Object 在处理大量数据时性能差异
|
5月前
|
存储 缓存 监控
提升阿里云 RPA 性能的方法
随着企业对业务流程自动化的需求不断增长,阿里云 RPA(机器人流程自动化)的性能成为了关注的焦点。本文将介绍一些提升阿里云 RPA 性能的方法,帮助您充分发挥其潜力,实现更高效的业务流程自动化。
|
5月前
|
JavaScript 前端开发
for 和 foreach 谁的执行效率更快
for 和 foreach 谁的执行效率更快
109 0
|
10月前
|
C#
C# for和foreach两种循环的效率问题
C# for和foreach两种循环的效率问题
|
11月前
toArray指定的容量和效率关系
toArray指定的容量和效率关系
47 0
|
机器学习/深度学习 计算机视觉 数据可视化
YOLOv5改进系列(0)——重要性能指标、训练结果评价及分析、影响mAP指标的因素、优化mAP的方法
YOLOv5改进系列(0)——重要性能指标、训练结果评价及分析、影响mAP指标的因素、优化mAP的方法
6540 0
YOLOv5改进系列(0)——重要性能指标、训练结果评价及分析、影响mAP指标的因素、优化mAP的方法