全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3299
推到 Plurk!
推到 Facebook!

TStingList 與 Array 的差別

答題得分者是:jimmy_wei
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-28 21:52:51 IP:61.66.xxx.xxx 未訂閱
請問各位一個觀念上的問題 myArray: Array of string; myString: TStringList; 兩者宣告 SetLength(myArray,10) 與 myString.Items.Add(10筆) 1.何者在處理的效能上比較好 2.何者比較佔用windows資源 3.在onCreate 中建立 myString:= TStringList.Create; SetLength(myArray,10); 在 onClose中 有下myString.Free及不下似乎有很大的差別(當再次進入程式比較容易造成當機) 但使用myArrry, 即使在onClose 不做Setlength(myArray,0) 也不會怎樣, 這差別在那? 會提這個問題, 是因為我稍早用TstringList, 但似乎很不穩定, 經常出現 Access 的存取錯誤, 改用Array就好了 我的測試環境是 win98se delphi5
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-29 10:08:26 IP:147.8.xxx.xxx 未訂閱
1) I think array is more efficient 2) TStringList 3) I think the compiler do the freeing when myArray goes out of scope. Anyway freeing it manually makes a good habit.    
引言:當再次進入程式比較容易造成當機
??? Really? I think you only create memory leakage if not freeing it.... P.S. There is a Capacity property in TStringList.
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-29 14:49:16 IP:61.220.xxx.xxx 未訂閱
就我所知 array是data type TStringList是object 所以理論上 1.array的效能會好一點,但是我想除非是上萬筆的迴圈或資料 否則其實你應該不太可能感覺出來兩則的差異 2.正因array是data type TStringList是object所以 TStringList所用的系統資源一定比較多,因為TStringList 有許多的Properties及Methods可供使用所以應該會多使用 到一些系統的資源 3.在delphi裡是說資料在系統結束之後會自己放啦,但是我覺 得,自己free來的安心多了,因為我覺得有時候delphi的資源 不見得可以都完整的釋放回來,久了會當是真的,但是,您所 說的access存取錯誤,我就沒遇過了,除非我沒有按正常的方 法使用TStringList,否則真的沒遇過這種情形耶,其實,除非 必要,不然我實在是很少用array來存string了...
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-30 02:44:14 IP:61.70.xxx.xxx 未訂閱
引言: 就我所知 array是data type TStringList是object 所以理論上 1.array的效能會好一點,但是我想除非是上萬筆的迴圈或資料 否則其實你應該不太可能感覺出來兩則的差異 2.正因array是data type TStringList是object所以 TStringList所用的系統資源一定比較多,因為TStringList 有許多的Properties及Methods可供使用所以應該會多使用 到一些系統的資源 3.在delphi裡是說資料在系統結束之後會自己放啦,但是我覺 得,自己free來的安心多了,因為我覺得有時候delphi的資源 不見得可以都完整的釋放回來,久了會當是真的,但是,您所 說的access存取錯誤,我就沒遇過了,除非我沒有按正常的方 法使用TStringList,否則真的沒遇過這種情形耶,其實,除非 必要,不然我實在是很少用array來存string了...
1.2.對 3.錯 當你使用物件時,凡是你 create 的,若不是用 *.create(Self); 這個語法的都必須由你來釋放,不然會永久賴在系統記憶體內,因為當 create 時若有指定owner,即 self ,則當 owner 被是釋放時,會一併釋放其擁有的物件,所以才不用擔心 free 的問題,所以不是 Delphi 釋放不全,而是你的疏失,至於單純型態的 array ,則由 Delphi 來幫你管理,所以不用處理釋放的問題,即使你用的是動態陣列,而你沒有使用 array = nil 來釋放,Delphi 也會幫你做,這些 Delphi Help 都有提到,看仔細一點吧!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-30 11:12:51 IP:210.3.xxx.xxx 未訂閱
引言: 3.錯 當你使用物件時,凡是你 create 的,若不是用 *.create(Self); 這個語法的都必須由你來釋放,不然會永久賴在系統記憶體內,因為當 create 時若有指定owner,即 self ,則當 owner 被是釋放時,會一併釋放其擁有的物件,所以才不用擔心 free 的問題,所以不是 Delphi 釋放不全,而是你的疏失,至於單純型態的 array ,則由 Delphi 來幫你管理,所以不用處理釋放的問題,即使你用的是動態陣列,而你沒有使用 array = nil 來釋放,Delphi 也會幫你做,這些 Delphi Help 都有提到,看仔細一點吧!
I think only TComponent will do this
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-31 22:08:45 IP:61.66.xxx.xxx 未訂閱
感謝william版主及各位網友的說明, 我大致上是明白了, 本著鼓勵新人的原 則, 我把分數給jimmy_wei, 但也感謝syntax提出的指正!
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-01-12 13:42:26 IP:203.186.xxx.xxx 訂閱
補充:
tstringlist是繼承tlist,而tlist的本質是利用array
所謂效能,到底指什麼呢
如果單純插入移除,array當然好
但如果需要尋找,移除,反而tstringlist會更好
你需要的效能是實際應用還是純粹插入
allen-86
一般會員


發表:28
回覆:44
積分:19
註冊:2008-02-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-01-12 15:32:58 IP:221.225.xxx.xxx 訂閱
學習了.
在實際應用中感覺TStringList效率還可以的.
------
The empty vessels make the greatest sound.
系統時間:2017-10-21 14:36:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!