線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2995
推到 Plurk!
推到 Facebook!

請問有關程式執行效率問題??

答題得分者是:hagar
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-08-11 17:50:05 IP:219.87.xxx.xxx 訂閱
請問各位,寫程式寫了一段時間,發現寫出來的程式執行效率都比不上人家(指外面賣的軟體而言)寫的軟體的執行效率,我上了google查了一下,突然發現不知要用什麼關鍵字可以搜尋的到如何讓程式執行快一點(當然不是換硬體啦),有沒有人可以提供一些寫程式時,是否有什麼比較不要使用的(就是少用的語法),例如少用case或是少用if…等等啦,實在是沒什麼頭緒,站上很多經驗很豊富的人,所以想請教一下,有沒有什麼可以再改善的,或是指導小弟一下,是不是在寫程式時,有什麼地方要注意或是考慮的,請各位不吝指教,謝謝你的觀看。
------
DELPHI初學者
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-08-11 22:46:51 IP:219.84.xxx.xxx 訂閱
你平常寫的程式都是寫什麼程式?
如果是影像處理,或大量資料運算....才會有這種執行效能的考量....
如果你有一套超級無敵的演算法,可以把複雜的運算用很簡單的方法運算出來,如此在執行結果上就會有效能優異的表現,但如果你真的掌握這種超級無敵演算法的話,你應該會是在學術界或其它地方發展....不會繼續在沒前途的資訊界發展吧(只是玩笑話,聽聽就好).....
如果你沒有超級演算法的話,想要快速的增進你程式的效能,改開發工具應該是你唯一的選擇吧....一般來說,同樣的處理程序,C 應該會比Delphi來的快一點。當然你想用組合語言去硬幹的話...效能絕對是衝上天....但開發時程就會相對的拉長....
以前在修程式開發或資料結構時(尤其是C的課程),都會有那種將程式碼精簡到旁人無法一眼看的明白,但這樣的code,執行起來效能就超級快,但付出的代價就是....後續維護的人很辛苦。
但那是以前在 286 386 的年代,硬體效能不好....才會有需要這樣的處理。
現在的硬體跟以前相比,真的是天壤之別......現在的開發工具....擺個Button ,按了一下 Click ,做個簡單的Showmessage('AAA'); ,後面都不知道跑了幾萬行的程式了。
你現在再去注意 case 不要用,if 也不要用的這些問題,效果絕對是有.....但肯定不大......以現有的硬體,幾乎可以讓你不用去考慮這些,專心把你要的規則寫出來就對了。
如果真的有速度的考量,建議你還是朝「換開發工具」著手會比較實際一點。

P.S 以上只針對程式處理,若是有牽扯到資料庫,SQL語法效能調校又是另一回事了。
以上僅供參考,謝謝




===================引 用 macchen 文 章===================
請問各位,寫程式寫了一段時間,發現寫出來的程式執行效率都比不上人家(指外面賣的軟體而言)寫的軟體的執行效率,我上了google查了一下,突然發現不知要用什麼關鍵字可以搜尋的到如何讓程式執行快一點(當然不是換硬體啦),有沒有人可以提供一些寫程式時,是否有什麼比較不要使用的(就是少用的語法),例如少用case或是少用if…等等啦,實在是沒什麼頭緒,站上很多經驗很豊富的人,所以想請教一下,有沒有什麼可以再改善的,或是指導小弟一下,是不是在寫程式時,有什麼地方要注意或是考慮的,請各位不吝指教,謝謝你的觀看。
編輯記錄
carstyc 重新編輯於 2010-08-11 22:49:26, 註解 無‧
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-08-12 09:50:29 IP:219.87.xxx.xxx 訂閱
謝謝你的回覆,我最近是在寫文字轉檔的工具啦,不會很複雜,但是卻常常需要做文件的解訪譯的動作,例如:1 2 3 4 5,要取這個的token,我覺的這個部份有沒有什麼地方可以改善效能呢,因為常常需要取其中的字串來當欄位,當然啦如果是db的部份其實調校好sql的部份,大多數也沒什麼操作,比較不用care到速度啦(目前是這樣的),回到正題,所以依照大大的說話,其實要改善效能的話,只能從演算法(目前工具是parse文字,需要algothrim嗎??小弟不是很清楚,如果有的話請指導一下小弟,謝謝)或是開發工具這二方面著手嗎?謝謝你的回覆,請再給小弟一些觀念指導,謝謝。

===================引 用 carstyc 文 章===================
你平常寫的程式都是寫什麼程式?
如果是影像處理,或大量資料運算....才會有這種執行效能的考量....
如果你有一套超級無敵的演算法,可以把複雜的運算用很簡單的方法運算出來,如此在執行結果上就會有效能優異的表現,但如果你真的掌握這種超級無敵演算法的話,你應該會是在學術界或其它地方發展....不會繼續在沒前途的資訊界發展吧(只是玩笑話,聽聽就好).....
如果你沒有超級演算法的話,想要快速的增進你程式的效能,改開發工具應該是你唯一的選擇吧....一般來說,同樣的處理程序,C 應該會比Delphi來的快一點。當然你想用組合語言去硬幹的話...效能絕對是衝上天....但開發時程就會相對的拉長....
以前在修程式開發或資料結構時(尤其是C的課程),都會有那種將程式碼精簡到旁人無法一眼看的明白,但這樣的code,執行起來效能就超級快,但付出的代價就是....後續維護的人很辛苦。
但那是以前在 286 386 的年代,硬體效能不好....才會有需要這樣的處理。
現在的硬體跟以前相比,真的是天壤之別......現在的開發工具....擺個Button ,按了一下 Click ,做個簡單的Showmessage('AAA');? ,後面都不知道跑了幾萬行的程式了。
你現在再去注意 case 不要用,if 也不要用的這些問題,效果絕對是有.....但肯定不大......以現有的硬體,幾乎可以讓你不用去考慮這些,專心把你要的規則寫出來就對了。
如果真的有速度的考量,建議你還是朝「換開發工具」著手會比較實際一點。

P.S 以上只針對程式處理,若是有牽扯到資料庫,SQL語法效能調校又是另一回事了。
以上僅供參考,謝謝

------
DELPHI初學者
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-08-13 17:24:04 IP:210.242.xxx.xxx 未訂閱
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-08-14 01:26:18 IP:211.74.xxx.xxx 訂閱
不論是寫DB or 轉檔程式, 最常碰到迴圈處理的問題 ... 這往往是程式效能能否突破的關鍵所在.
因為大家習慣在處理大量資料迴圈時, 是使用遞加法, 也就是
while (條件值) do begin
...
Next; <----
end;

or

Memo1.Line.LoadFromFile('D:\Test.txt');
for i:=0 to Memo1.Line.Count-1 do begin
....
end;

都是將指標往下累加移動, 如此一來, 當要處理的資料筆數或列數有上萬筆時, 這種方式就會拖累程式效能.
之前有人 po 文說, 在處理DB資料轉出至Excel時, 程式效率很差, 容易當掉,
我就曾建議他改用遞減法, 確實可以加快程式處理的速度; 如:
while (條件值) do begin
...
Delete; <----
First; <---
end;

or

Memo1.Line.LoadFromFile('D:\Test.txt');
Memo1.Line.BeginUpdate;
try
while (Memo1.Line.Count>0) do begin
....
Memo1.Line.Delete(0);
end;
finally
Memo1.Line.EndUpdate;
end;

因為指標幾乎不移動, 且所使用的記憶體會愈來愈少, 程式處理自然加快 ...
以上拙見, 提供參考.
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-08-16 14:25:23 IP:219.87.xxx.xxx 訂閱
謝謝版主的回覆,想請問一下,有關pchar的關念,就是依據範例來看,移動pchar為什麼會比char快呢?我指的是s := '123',如果我改用s[1]這種會比用pchar慢嗎?謝謝。
===================引 用 hagar 文 章===================
一些資料:
http://stackoverflow.com/questions/287789/what-is-the-fastest-way-to-parse-a-line-in-delphi
------
DELPHI初學者
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-08-16 14:53:26 IP:220.130.xxx.xxx 訂閱
String的機制是immutable,這樣的設計下是無法直接更改該變數的值,所以Delphi幫我們作了這件事。
var s : string;
s:='123';
s[1] = '4';
其實際的動作為
var p. tmp : pchar; i : integer;
begin
p = allocmem(4);
p[0]:='1';
p[1]:='2';
p[2]:='3';
p[3]:=0;
//以上為s:='123';, 以下為s[1]='4';string的start index為1, pchar為0
tmp = allocmem(4);//new mem space and size
tmp[0]:='4';
tmp[1]:=p[1];
tmp[2]:=p[2];
tmp[3]:=0;
dispose(p);
p:=tmp;
tmp=nil;

而對pchar來說,如果s的type為pchar,那麼上半段依舊,下半段會如你所願只修改第一個字元的值。
string之所以方便在於它儲存整個string的長度,而不像c-style(pchar)以\0作為判斷,對於純粹讀取的效率較高,也不受限\0的問題。
但是pchar本身就是使用指標的操作方式,因此存在指標的效率與風險

stackoverflow給的作法看起來有點tricky..:P


===================引 用 macchen 文 章===================
謝謝版主的回覆,想請問一下,有關pchar的關念,就是依據範例來看,移動pchar為什麼會比char快呢?我指的是s := '123',如果我改用s[1]這種會比用pchar慢嗎?謝謝。
===================引 用 hagar 文 章===================
一些資料:
http://stackoverflow.com/questions/287789/what-is-the-fastest-way-to-parse-a-line-in-delphi
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2010-08-16 22:40:30, 註解 少了dispose...:P‧
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-08-23 09:47:47 IP:219.87.xxx.xxx 訂閱
謝謝coffee的回覆,我還是有點不是很清楚差異在那呢?你是指因為delphi有再額外處理過string給值嗎?所以版主的意思是說,string的處理也是pchar在處理(只是這段由delphi包起來了),所以如果我們要加快"字串"的處理,就直接使用pchar的方式來處理,相對會比較快,是這個意思嗎(我對pchar真的還是搞不懂),謝謝,請再給小弟一些關觀上的指導,謝謝各位的回覆。

===================引 用 Coffee 文 章===================
String的機制是immutable,這樣的設計下是無法直接更改該變數的值,所以Delphi幫我們作了這件事。
var s :?string;
s:='123';
s[1] = '4';
其實際的動作為
var p. tmp :?pchar; i : integer;
begin
p = allocmem(4);
p[0]:='1';
p[1]:='2';
p[2]:='3';
p[3]:=0;
//以上為s:='123';, 以下為s[1]='4';string的start index為1, pchar為0
tmp = allocmem(4);//new mem space and size
tmp[0]:='4';
tmp[1]:=p[1];
tmp[2]:=p[2];
tmp[3]:=0;
dispose(p);
p:=tmp;
tmp=nil;

而對pchar來說,如果s的type為pchar,那麼上半段依舊,下半段會如你所願只修改第一個字元的值。
string之所以方便在於它儲存整個string的長度,而不像c-style(pchar)以\0作為判斷,對於純粹讀取的效率較高,也不受限\0的問題。
但是pchar本身就是使用指標的操作方式,因此存在指標的效率與風險

stackoverflow給的作法看起來有點tricky..:P
------
DELPHI初學者
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-08-23 16:43:36 IP:220.130.xxx.xxx 訂閱
如果你只是想要知道如何更快,hagar前輩提供的連結是個不錯的參考。
如果你想要知道操作pchar,建議你回頭看一下help有關pchar, null-terminated string的函式及說明,或者找本書來看
如果你想知道為什麼要這麼作會比較快,建議你了解一下程式語言本身的實作,我先前寫的這些資訊也是從一些Delphi的書上看來的,雖然String本身的實作不完全像我寫的這樣,但基本原理相去不遠。

===================引 用 macchen 文 章===================
謝謝coffee的回覆,我還是有點不是很清楚差異在那呢?你是指因為delphi有再額外處理過string給值嗎?所以版主的意思是說,string的處理也是pchar在處理(只是這段由delphi包起來了),所以如果我們要加快"字串"的處理,就直接使用pchar的方式來處理,相對會比較快,是這個意思嗎(我對pchar真的還是搞不懂),謝謝,請再給小弟一些關觀上的指導,謝謝各位的回覆。

===================引 用 Coffee 文 章===================
String的機制是immutable,這樣的設計下是無法直接更改該變數的值,所以Delphi幫我們作了這件事。
var s :?string;
s:='123';
s[1] = '4';
其實際的動作為
var p. tmp :?pchar; i : integer;
begin
p = allocmem(4);
p[0]:='1';
p[1]:='2';
p[2]:='3';
p[3]:=0;
//以上為s:='123';, 以下為s[1]='4';string的start index為1, pchar為0
tmp = allocmem(4);//new mem space and size
tmp[0]:='4';
tmp[1]:=p[1];
tmp[2]:=p[2];
tmp[3]:=0;
dispose(p);
p:=tmp;
tmp=nil;

而對pchar來說,如果s的type為pchar,那麼上半段依舊,下半段會如你所願只修改第一個字元的值。
string之所以方便在於它儲存整個string的長度,而不像c-style(pchar)以\0作為判斷,對於純粹讀取的效率較高,也不受限\0的問題。
但是pchar本身就是使用指標的操作方式,因此存在指標的效率與風險

stackoverflow給的作法看起來有點tricky..:P
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-08-24 17:24:16 IP:219.87.xxx.xxx 訂閱
非常謝謝coffee的回覆,因為hagar版主提供的連結可以提供我很好的範例,我可以直接改成我要的程式,雖然基礎我不是很了解,所以改的時候會有一種不知為什麼的這樣改的問題,雖然程式已經改好了,但我還是很希望能了解為什麼會這樣,畢竟了解越多越能寫出好一點的東西啦,謝謝你的回覆,我會再找找相關的資料,謝謝。

題外話:hagar真的很強大呢(好多論壇都有他的名字),想說要跟他一樣強,一定要有很多的經驗吧,謝謝啦。

===================引 用 Coffee 文 章===================
如果你只是想要知道如何更快,hagar前輩提供的連結是個不錯的參考。
如果你想要知道操作pchar,建議你回頭看一下help有關pchar, null-terminated string的函式及說明,或者找本書來看
如果你想知道為什麼要這麼作會比較快,建議你了解一下程式語言本身的實作,我先前寫的這些資訊也是從一些Delphi的書上看來的,雖然String本身的實作不完全像我寫的這樣,但基本原理相去不遠。
------
DELPHI初學者
系統時間:2024-04-27 5:42:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!