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


     

  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/baiyu/p/2345889.html
Copyright © 2011-2022 走看看