程式設計中注意的乙個問題

2021-03-31 08:56:58 字數 1868 閱讀 5120

在程式設計中經常會碰到程式執行效率低的問題,而有時候問題時出在迴圈體中。我們通過下面乙個例子看在程式設計中要注意的問題。

在這個例子中的**主要功能是定時檢查資料庫中的幾個表是否發生了更新,如果有更新則自動重新整理顯示視窗中的對應資料網格。檢查這幾個表的資料是否更新是通過判斷乙個資料表中對應表名的乙個標誌字段值是否為

1,如果為

1,則表示該錶已更新,資料網格需要重新整理。

下面這段**是優化前的**(該**在

timer

控制項的ontime

事件執行):

try //

停止timer

控制項的計時

timeupdate.enabled := false;

讀取記錄重新整理狀態的表的資料

//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

pchar(err_timeupdatetime***il + #13 + e.message),

'error',

mb_iconerror

);

end;

因為某些表的資料量比較大

,所以在重新整理網格的時候會有停頓,經過優化資料庫結構,增加冗餘字段,重新整理速度已經獲得提高,但還是存在停頓一到兩秒的情況。因為一開始主要集中點在資料庫上,所以沒考慮到**在執行效率上存在的問題。當在一次測試中發現,當沒有任何資料網格需要重新整理的情況下也要停頓一到兩秒。我立刻想到這肯定是**的執行效率有問題。經過分析,發現無論是否有資料更新,程式都要執行一次

while

迴圈,而這個

while

要遍歷所有記錄,當發現資料更新時,還要乙個乙個的修改標誌值並儲存回資料庫。於是立刻讓程式設計師做一下修改: 1、

唯讀標誌值為

1的記錄,減少迴圈次數;當沒有標誌值為

1的記錄時,不執行迴圈和更新操作。 2、

在最後通過

update

語句更新所有標誌值為

1的記錄

經過修改,程式的停頓現象消失了,重新整理效率大大提高。

以上**是一些程式設計師經常會犯的錯誤,主要是沒考慮到多餘的迴圈會增加不少**執行時間。而通過減少迴圈次數,往往是提高**執行效率的有效方法。

程式設計中注意的乙個問題

在程式設計中經常會碰到程式執行效率低的問題,而有時候問題時出在迴圈體中。我們通過下面乙個例子看在程式設計中要注意的問題。在這個例子中的 主要功能是定時檢查資料庫中的幾個表是否發生了更新,如果有更新則自動重新整理顯示視窗中的對應資料網格。檢查這幾個表的資料是否更新是通過判斷乙個資料表中對應表名的乙個標...

程式設計中注意的乙個問題

在程式設計中經常會碰到程式執行效率低的問題,而有時候問題時出在迴圈體中。我們通過下面乙個例子看在程式設計中要注意的問題。在這個例子中的 主要功能是定時檢查資料庫中的幾個表是否發生了更新,如果有更新則自動重新整理顯示視窗中的對應資料網格。檢查這幾個表的資料是否更新是通過判斷乙個資料表中對應表名的乙個標...

程式設計中注意的乙個問題

在程式設計中經常會碰到程式執行效率低的問題,而有時候問題時出在迴圈體中。我們通過下面乙個例子看在程式設計中要注意的問題。在這個例子中的 主要功能是定時檢查資料庫中的幾個表是否發生了更新,如果有更新則自動重新整理顯示視窗中的對應資料網格。檢查這幾個表的資料是否更新是通過判斷乙個資料表中對應表名的乙個標...