通過(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)象消失了,刷新效率大大提高。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注