国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

代碼優(yōu)化分析一例

2019-11-18 18:06:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
 

通過(guò)代碼優(yōu)化,可以提高代碼的執(zhí)行效率,從而提升程序的品質(zhì)。因而優(yōu)化代碼是程序員提高自身水平,提高技能的一個(gè)很重要途徑。不同的代碼有不同的分析方法,有不同的優(yōu)化方法,而這全憑程序員的經(jīng)驗(yàn)積累和自身水平。在公司里我既擔(dān)任項(xiàng)目經(jīng)理,也擔(dān)任系統(tǒng)分析員,因而經(jīng)常需要幫助程序員優(yōu)化代碼,因而在工作中積累了一些經(jīng)驗(yàn)。為了將這些經(jīng)驗(yàn)介紹給大家,我特意找了公司項(xiàng)目中的一個(gè)很典型的例子來(lái)做分析,希望大家有所收益。

在這個(gè)例子中的代碼主要功能是定時(shí)檢查數(shù)據(jù)庫(kù)中的幾個(gè)表是否發(fā)生了更新,如果有更新則自動(dòng)刷新顯示窗口中的對(duì)應(yīng)數(shù)據(jù)網(wǎng)格。檢查這幾個(gè)表的數(shù)據(jù)是否更新是通過(guò)判斷一個(gè)數(shù)據(jù)表中對(duì)應(yīng)表名的一個(gè)標(biāo)志字段值是否為1,如果為1,則表示該表已更新,數(shù)據(jù)網(wǎng)格需要刷新。

下面這段代碼是優(yōu)化前的代碼(該代碼在Timer控件的OnTime事件運(yùn)行):

  try

       //停止Timer控件的計(jì)時(shí)

    Timeupdate.Enabled := False;

 

   ////讀取記錄刷新?tīng)顟B(tài)的表的數(shù)據(jù)

   //ADOQryReadUpdate.Refresh;

   //ADOQryReadUpdate.Requery();

    ADOQryReadUpdate.Close;

    ADOQryReadUpdate.Open;

    ADOQryReadUpdate.First;

   //通過(guò)循環(huán)判斷那個(gè)表已經(jīng)更新

    with ADOQryReadUpdate do

      while not Eof do

      begin

        bFlag := False;

              //判斷對(duì)應(yīng)表名的標(biāo)志字段是否為1,如果為1則刷新對(duì)應(yīng)數(shù)據(jù)網(wǎng)格

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

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

        begin

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

                     //刷新數(shù)據(jù)網(wǎng)格代碼,這里略去了

                     ……

        if bFlag then

        begin

                     //修改對(duì)應(yīng)表標(biāo)志值為0

          Edit;

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

          Post;

        end;

        Next;

      end;

//恢復(fù)Timer控件為工作狀態(tài)

   Timeupdate.Enabled := True;

  except

    on E: Exception do

      application.MessageBox(

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

        'Error',

        MB_ICONERROR

        );

  end;

因?yàn)槟承┍淼臄?shù)據(jù)量比較大所以在刷新網(wǎng)格的時(shí)候會(huì)有停頓,經(jīng)過(guò)優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu),增加冗余字段,刷新速度已經(jīng)獲得提高,但還是存在停頓一到兩秒的情況。因?yàn)橐婚_(kāi)始主要集中點(diǎn)在數(shù)據(jù)庫(kù)上,所以沒(méi)考慮到代碼在執(zhí)行效率上存在的問(wèn)題。當(dāng)在一次測(cè)試中發(fā)現(xiàn),當(dāng)沒(méi)有任何數(shù)據(jù)網(wǎng)格需要刷新的情況下也要停頓一到兩秒。我立刻想到這肯定是代碼的執(zhí)行效率有問(wèn)題。經(jīng)過(guò)分析,發(fā)現(xiàn)無(wú)論是否有數(shù)據(jù)更新,程序都要執(zhí)行一次While循環(huán),而這個(gè)While要遍歷所有記錄,當(dāng)發(fā)現(xiàn)數(shù)據(jù)更新時(shí),還要一個(gè)一個(gè)的修改標(biāo)志值并保存回?cái)?shù)據(jù)庫(kù)。于是立刻讓程序員做一下修改:

1、  只讀標(biāo)志值為1的記錄,減少循環(huán)次數(shù);當(dāng)沒(méi)有標(biāo)志值為1的記錄時(shí),不執(zhí)行循環(huán)和更新操作。

2、  在最后通過(guò)UPDATE語(yǔ)句更新所有標(biāo)志值為1的記錄

經(jīng)過(guò)修改,程序的停頓現(xiàn)象消失了,刷新效率大大提高。

    以上代碼是一些程序員經(jīng)常會(huì)犯的錯(cuò)誤,主要是沒(méi)考慮到多余的循環(huán)會(huì)增加不少代碼運(yùn)行時(shí)間。而通過(guò)減少循環(huán)次數(shù),往往是提高代碼執(zhí)行效率的有效方法。


上一篇:修正XPMenu的兩個(gè)Bug

下一篇:IntToHex(10-16進(jìn)制的轉(zhuǎn)換)

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門(mén)圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 延川县| 甘洛县| 工布江达县| 谷城县| 屏山县| 安阳县| 浮山县| 获嘉县| 城口县| 白河县| 蒲江县| 合阳县| 壶关县| 新河县| 涿州市| 高雄县| 天长市| 昭觉县| 广宁县| 天峨县| 五莲县| 温泉县| 长顺县| 获嘉县| 陕西省| 县级市| 汉中市| 清水县| 定远县| 炎陵县| 武功县| 苍溪县| 桂林市| 长寿区| 绍兴市| 毕节市| 得荣县| 金川县| 广汉市| 忻城县| 峨山|