编程中注意的一个问题

编程中常遇到程序执行效率低的问题,有时问题出在循环体。文中给出一段代码示例,指出部分程序员常犯未考虑多余循环增加运行时间的错误,强调减少循环次数是提高代码执行效率的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编程中经常会碰到程序执行效率低的问题,而有时候问题时出在循环体中。我们通过下面一个例子看在编程中要注意的问题。

在这个例子中的代码主要功能是定时检查数据库中的几个表是否发生了更新,如果有更新则自动刷新显示窗口中的对应数据网格。检查这几个表的数据是否更新是通过判断一个数据表中对应表名的一个标志字段值是否为1,如果为1,则表示该表已更新,数据网格需要刷新。
下面这段代码是优化前的代码(该代码在Timer控件的OnTime事件运行):
  1. try 
  2.  
  3.        //停止Timer控件的计时  
  4.  
  5.     Timeupdate.Enabled := False;  
  6.  
  7.    
  8.  
  9.    ////读取记录刷新状态的表的数据   
  10.  
  11.    //ADOQryReadUpdate.Refresh;  
  12.  
  13.    //ADOQryReadUpdate.Requery();  
  14.  
  15.     ADOQryReadUpdate.Close;  
  16.  
  17.     ADOQryReadUpdate.Open;  
  18.  
  19.     ADOQryReadUpdate.First;  
  20.  
  21.    //通过循环判断那个表已经更新  
  22.  
  23.     with ADOQryReadUpdate do 
  24.  
  25.       while not Eof do 
  26.  
  27.       begin  
  28.  
  29.         bFlag := False;  
  30.  
  31.               //判断对应表名的标志字段是否为1,如果为1则刷新对应数据网格  
  32.  
  33.         if (FieldByName('flag').asinteger = 1)  
  34.  
  35.           and (FieldByName('channelid').AsInteger = LoginChannelID) then  
  36.  
  37.         begin  
  38.  
  39.           sName := FieldByName('name').asstring;  
  40.  
  41.                      //刷新数据网格代码,这里略去了  
  42.  
  43.                      ……  
  44.  
  45.         if bFlag then  
  46.  
  47.         begin  
  48.  
  49.                      //修改对应表标志值为0  
  50.  
  51.           Edit;  
  52.  
  53.           FieldByName('flag').asBoolean := False;  
  54.  
  55.           Post;  
  56.  
  57.         end;  
  58.  
  59.         Next;  
  60.  
  61.       end;  
  62.  
  63. //恢复Timer控件为工作状态  
  64.  
  65.    Timeupdate.Enabled := True;  
  66.  
  67.   except  
  68.  
  69.     on E: Exception do 
  70.  
  71.       Application.MessageBox(  
  72.  
  73.         pchar(Err_TimeUpdateTimerFail + #13 + E.Message),  
  74.  
  75.         'Error',  
  76.  
  77.         MB_ICONERROR  
  78.  
  79.         );  
  80.  
  81.   end; 
因为某些表的数据量比较大,所以在刷新网格的时候会有停顿,经过优化数据库结构,增加冗余字段,刷新速度已经获得提高,但还是存在停顿一到两秒的情况。因为一开始主要集中点在数据库上,所以没考虑到代码在执行效率上存在的问题。当在一次测试中发现,当没有任何数据网格需要刷新的情况下也要停顿一到两秒。我立刻想到这肯定是代码的执行效率有问题。经过分析,发现无论是否有数据更新,程序都要执行一次While循环,而这个While要遍历所有记录,当发现数据更新时,还要一个一个的修改标志值并保存回数据库。于是立刻让程序员做一下修改:
1、只读标志值为1的记录,减少循环次数;当没有标志值为1的记录时,不执行循环和更新操作。
2、在最后通过UPDATE语句更新所有标志值为1的记录
经过修改,程序的停顿现象消失了,刷新效率大大提高。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值