通過代碼優化,可以提高代碼的執行效率,從而提升程序的品質。因而優化代碼是程序員提高自身水平,提高技能的一個很重要途徑。不同的代碼有不同的分析方法,有不同的優化方法,而這全憑程序員的經驗積累和自身水平。在公司裡我既擔任項目經理,也擔任系統分析員,因而經常需要幫助程序員優化代碼,因而在工作中積累了一些經驗。為了將這些經驗介紹給大家,我特意找了公司項目中的一個很典型的例子來做分析,希望大家有所收益。
在這個例子中的代碼主要功能是定時檢查數據庫中的幾個表是否發生了更新,如果有更新則自動刷新顯示窗口中的對應數據網格。檢查這幾個表的數據是否更新是通過判斷一個數據表中對應表名的一個標志字段值是否為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;
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
Application.MessageBox(
pchar(Err_TimeUpdateTimerFail + #13 + E.Message),
'Error',
MB_ICONERROR
);
end;
因為某些表的數據量比較大,所以在刷新網格的時候會有停頓,經過優化數據庫結構,增加冗余字段,刷新速度已經獲得提高,但還是存在停頓一到兩秒的情況。因為一開始主要集中點在數據庫上,所以沒考慮到代碼在執行效率上存在的問題。當在一次測試中發現,當沒有任何數據網格需要刷新的情況下也要停頓一到兩秒。我立刻想到這肯定是代碼的執行效率有問題。經過分析,發現無論是否有數據更新,程序都要執行一次While循環,而這個While要遍歷所有記錄,當發現數據更新時,還要一個一個的修改標志值並保存回數據庫。於是立刻讓程序員做一下修改:
1、 只讀標志值為1的記錄,減少循環次數;當沒有標志值為1的記錄時,不執行循環和更新操作。
2、 在最後通過UPDATE語句更新所有標志值為1的記錄
經過修改,程序的停頓現象消失了,刷新效率大大提高。