性能,使用Linq to sql 一个可能导致内存溢出的写法

话说程式性能提升1232011年08月19日 星期五 下午 1:26如果一直使用PC机运行net winform应用程式,也许还感觉不到性能提升的重要性。
自从开始搞windows ce应用开发,接驳微型打印机,电子称等应用。想不感受性能的重要性都难。
如果说如今的NOTEBOOK,台式机是内存资源上的富翁,那么PDA等这些微型设备简直就是一穷二白的穷汉。

废话也不多说了,个人总结到以下几点有碍性能的问题。

1,不必要的循环
2,在不必要的循环中生成不必要的对象
            在循环中如有需要判断跳出循环的条件,尽量写到开头。生成N个对象耗了内存之后再判断,则为时晚矣。
            在循环中如果需要查询数据库获得信息,返回类型尽量不要使用大对象如DataSet,DataTable等。如果返回的是单行的数据可以考虑使用一维数组,如果返回的是少数几个字段,可以使用ref,out这种方式。
3,滥用全局变量
4,冗余的数据来源集合
           尽可能只抓用到的数据,不要select *。同一个程式尽量重用集合,而不是每个操作或者循环中抓一次。
5,未及时释放连接,对象
            连接用完则close。不重用的集合用完则clear。每隔一段时间可以强制垃圾回收gc.collect。
6,过度重绘窗体
             这也是个要命的动作。成百上千甚至更多的数据,如果一次绘制一条到grid,则微型设备会晕倒。比如扫条码,操作员并不会每扫一条就去grid中看一下的。所以也不必要每扫一个条码就重绘Grid。等全部扫完,再一次性show出来,就会快很多。
7,一次性显示全部数据
             这个的解决办法可以参考web程式的分页显示了。查询完数据库,获得数据集合。第一次只show出前N条即可。
7,过度的事件监听
             虽然windows ce程式提供了lostfocus,getfocus,txtchanged等事件。为了那点少得可怜的内存,建议能不能就尽量不要用。
8,异常未处理
9,生成应用程式时,采用debug方式比release方式也会消耗更多的资源,阻碍性能的提升。

 

2011-11-23

如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。相差n-1次循环
==============================================

博客园闪存首页新随笔联系管理订阅 随笔- 12  文章- 0  评论- 20 
使用Linq to sql 一个可能导致内存溢出的写法
 最近由于系统的升级,经常会做一些对大量数据的批量更新的需求,因此常写一些处理工具来运行这些更新,前几天就发现我写的小工具会在运行一段时间后出现 OutOfMemory的错误,后来发现此问题源于Linq的一点使用不当导致的,看下面一段代码:


  long lastID = 0;

            using (MainDataContext db = new MainDataContext("...."))

            {

                while (true)

                {

                    var task = from t in db.Table where t.ID > lastID select t;

       if(task.Count()==0)

        break;

                    foreach (var atask in task)

                    {

                        //TODO 做相应处理

                    }

                }

            }

 

这样写的原因是, 想着在循环的外部创建一个MainDataContext,也就相当于保持了一个SQLServer链接,这样性能上会好一些,但DataContext这种东西是会自动保持上下文的,当我窒息了一次 select之后,虽然该变量时在while内部定义的,但在执行完相应的操作之后,这些被取出的数据并没有从数据库中移除,而是不断积累起来,这样就导致了在程序运行的过程中,内存不断的增加。

 当我修改了以上代码,把DataContext的创建放在循环内部之后,内存溢出的问题解决,而且性能上也比上面的写法好了一些。

 


 

你可能感兴趣的:(LINQ)