請問有關程式執行效率問題?? |
答題得分者是:hagar
|
macchen
初階會員 ![]() ![]() 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
請問各位,寫程式寫了一段時間,發現寫出來的程式執行效率都比不上人家(指外面賣的軟體而言)寫的軟體的執行效率,我上了google查了一下,突然發現不知要用什麼關鍵字可以搜尋的到如何讓程式執行快一點(當然不是換硬體啦),有沒有人可以提供一些寫程式時,是否有什麼比較不要使用的(就是少用的語法),例如少用case或是少用if…等等啦,實在是沒什麼頭緒,站上很多經驗很豊富的人,所以想請教一下,有沒有什麼可以再改善的,或是指導小弟一下,是不是在寫程式時,有什麼地方要注意或是考慮的,請各位不吝指教,謝謝你的觀看。
------
DELPHI初學者 |
carstyc
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
你平常寫的程式都是寫什麼程式?
如果是影像處理,或大量資料運算....才會有這種執行效能的考量.... 如果你有一套超級無敵的演算法,可以把複雜的運算用很簡單的方法運算出來,如此在執行結果上就會有效能優異的表現,但如果你真的掌握這種超級無敵演算法的話,你應該會是在學術界或其它地方發展....不會繼續在沒前途的資訊界發展吧(只是玩笑話,聽聽就好)..... 如果你沒有超級演算法的話,想要快速的增進你程式的效能,改開發工具應該是你唯一的選擇吧....一般來說,同樣的處理程序,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 發送簡訊給我 |
謝謝你的回覆,我最近是在寫文字轉檔的工具啦,不會很複雜,但是卻常常需要做文件的解訪譯的動作,例如: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 發送簡訊給我 |
|
smallfox
高階會員 ![]() ![]() ![]() ![]() 發表:2 回覆:113 積分:128 註冊:2003-02-19 發送簡訊給我 |
不論是寫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 發送簡訊給我 |
謝謝版主的回覆,想請問一下,有關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 發送簡訊給我 |
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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
如果你只是想要知道如何更快,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 發送簡訊給我 |
非常謝謝coffee的回覆,因為hagar版主提供的連結可以提供我很好的範例,我可以直接改成我要的程式,雖然基礎我不是很了解,所以改的時候會有一種不知為什麼的這樣改的問題,雖然程式已經改好了,但我還是很希望能了解為什麼會這樣,畢竟了解越多越能寫出好一點的東西啦,謝謝你的回覆,我會再找找相關的資料,謝謝。
題外話:hagar真的很強大呢(好多論壇都有他的名字),想說要跟他一樣強,一定要有很多的經驗吧,謝謝啦。 ===================引 用 Coffee 文 章=================== 如果你只是想要知道如何更快,hagar前輩提供的連結是個不錯的參考。 如果你想要知道操作pchar,建議你回頭看一下help有關pchar, null-terminated string的函式及說明,或者找本書來看 如果你想知道為什麼要這麼作會比較快,建議你了解一下程式語言本身的實作,我先前寫的這些資訊也是從一些Delphi的書上看來的,雖然String本身的實作不完全像我寫的這樣,但基本原理相去不遠。
------
DELPHI初學者 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |