ToList<>()所带来的性能影响
2011-05-10 09:32
323 查看
前几天优化师弟写的代码,有一个地方给我留下很深刻的印象,就是我发现他总是将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(李鸣),欢迎您关注我的下一篇文章
有时候对于方法的不甚了解加上“习惯”,往往是程序性能和稳定性终结者,就拿这个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(李鸣),欢迎您关注我的下一篇文章
相关文章推荐
- ToList<>()所带来的性能影响
- 调用play的jpa查询数据时添加Transformers.ALIAS_TO_ENTITY_MAP可将结果集封装到list<map>对象里
- C# List<>与Array性能比较
- LINQ TO LIST<T> 合并列表
- list<Object> to list<String>
- BinaryTreeConvertToDoubleList____<1>
- wcf服务引用-List<T> to T[]
- C#调用函数传参数IEnumerable<ClassA> classlist.ToList(),不会改变classlist
- 扩展方法 DataTable To List<T>
- C# List<>与Array性能比较
- list<string> to byte[]
- “System.Collections.Generic.IEnumerable<TestDAL.HistoryData>”不包含“ToList”的定义
- How to convert List<Integer> to int[] in Java?
- Type safety: Unchecked cast from List to List<Book>
- net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx 关于JSON对象解析List<XXX>在调用时出错问题
- GridView bound to an IList<T>
- “System.Collections.Generic.IEnumerable<TestDAL.HistoryData>”不包含“ToList”的定义
- Array,ArrayList 和 List<T>的选择和性能比较.
- .NET泛型编程 性能提升工具 List<T>
- DataTable TO List<T>