zoukankan      html  css  js  c++  java
  • 性能,使用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的创建放在循环内部之后,内存溢出的问题解决,而且性能上也比上面的写法好了一些。


     

  • 相关阅读:
    [湖南集训]谈笑风生
    【SCOI2010】序列操作
    ●BZOJ 3994 [SDOI2015]约数个数和
    ●BZOJ 3309 DZY Loves Math
    ●UOJ 21 缩进优化
    ●BZOJ 2693 jzptab
    ●BZOJ 2154 Crash的数字表格
    ●BZOJ 3529 [Sdoi2014]数表
    ●2301 [HAOI2011] Problem b
    ●BZOJ 2820 YY的GCD
  • 原文地址:https://www.cnblogs.com/baiyu/p/2345889.html
Copyright © 2011-2022 走看看