代码优化分析一例

明月几时有163

明月几时有163

2016-02-19 16:22

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享代码优化分析一例吧。
 

通过代码优化,可以提高代码的执行效率,从而提升程序的品质。因而优化代码是程序员提高自身水平,提高技能的一个很重要途径。不同的代码有不同的分析方法,有不同的优化方法,而这全凭程序员的经验积累和自身水平。在公司里我既担任项目经理,也担任系统分析员,因而经常需要帮助程序员优化代码,因而在工作中积累了一些经验。为了将这些经验介绍给大家,我特意找了公司项目中的一个很典型的例子来做分析,希望大家有所收益。

在这个例子中的代码主要功能是定时检查数据库中的几个表是否发生了更新,如果有更新则自动刷新显示窗口中的对应数据网格。检查这几个表的数据是否更新是通过判断一个数据表中对应表名的一个标志字段值是否为1,如果为1,则表示该表已更新,数据网格需要刷新。

下面这段代码是优化前的代码(该代码在Timer控件的OnTime事件运行):

  try

       //停止Timer控件的计时

    Timeupdate.Enabled := False;

?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

   ////读取记录刷新状态的表的数据

   //ADOQryReadUpdate.Refresh;

   //ADOQryReadUpdate.Requery();

    ADOQryReadUpdate.Close;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

    ADOQryReadUpdate.Open;

    ADOQryReadUpdate.First;

   //通过循环判断那个表已经更新

    with ADOQryReadUpdate do

      while not Eof do

      begin

        bFlag := False;

              //判断对应表名的标志字段是否为1,如果为1则刷新对应数据网格

        if (FieldByName('flag').asinteger = 1)

          and (FieldByName('channelid').AsInteger = LoginChannelID) then

        begin

          sName := FieldByName('name').asstring;

                     //刷新数据网格代码,这里略去了

                     ……

        if bFlag then

        begin

                     //修改对应表标志值为0

          Edit;

          FieldByName('flag').asBoolean := False;

          Post;

        end;

        Next;

      end;

//恢复Timer控件为工作状态

   Timeupdate.Enabled := True;

  except

    on E: Exception do

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

      Application.MessageBox(

        pchar(Err_TimeUpdateTimerFail + #13 + E.Message),

        'Error',

        MB_ICONERROR

        );

  end;

因为某些表的数据量比较大,所以在刷新网格的时候会有停顿,经过优化数据库结构,增加冗余字段,刷新速度已经获得提高,但还是存在停顿一到两秒的情况。因为一开始主要集中点在数据库上,所以没考虑到代码在执行效率上存在的问题。当在一次测试中发现,当没有任何数据网格需要刷新的情况下也要停顿一到两秒。我立刻想到这肯定是代码的执行效率有问题。经过分析,发现无论是否有数据更新,程序都要执行一次While循环,而这个While要遍历所有记录,当发现数据更新时,还要一个一个的修改标志值并保存回数据库。于是立刻让程序员做一下修改:

1、  只读标志值为1的记录,减少循环次数;当没有标志值为1的记录时,不执行循环和更新操作。

2、  在最后通过UPDATE语句更新所有标志值为1的记录

经过修改,程序的停顿现象消失了,刷新效率大大提高。

    以上代码是一些程序员经常会犯的错误,主要是没考虑到多余的循环会增加不少代码运行时间。而通过减少循环次数,往往是提高代码执行效率的有效方法。
展开更多 50%)
分享

猜你喜欢

代码优化分析一例

编程语言 网络编程
代码优化分析一例

实现FTP访问一例

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
实现FTP访问一例

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

smtp邮件发送一例

PHP
smtp邮件发送一例

CAD解题思路一例

autocad教程
CAD解题思路一例

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

照片阴影处理一例

PS PS教程
照片阴影处理一例

简化SQL语句一例

SQLServer
简化SQL语句一例

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

ASP入门基础教程-多分支条件选择结构

ASP入门基础教程-多分支条件选择结构

关于MIDAS的安全问题的解决方案

关于MIDAS的安全问题的解决方案
下拉加载更多内容 ↓