服務端與客戶端絕對是兩碼事。在客戶端我們提倡
create/new
和free/dispose
,隨用隨申請,不用即釋放。但在服務端要盡量避免這樣做。在客戶端可以隨時使用
string
型別,但在服務端也必須盡量避免使用
string
。string
使用起來異常方便,但我們看看編譯後的**恐怕就會只冒冷汗:原來編譯器為
string
的方便做了那麼多額外的工作。客戶端要為客戶解決記憶體,但服務端能「浪費
」則「浪費
」。「玩伺服器就是玩記憶體」。
記憶體管理不當就會造成記憶體洩漏和記憶體碎片。對於客戶端而言,記憶體碎片幾乎不算是問題。記憶體洩漏那麼一點點也可以接受。
但對於24 * 7
的伺服器而言,這卻絕對致命
關於記憶體洩漏,只要記得保證申請和釋放動作的對稱性即可,外加一系列的測試工具,基本就可以把這個問題解決。
其次就是記憶體碎片。記憶體碎片問題的重要性絕不亞於記憶體洩漏。造成碎片的原因也是防不勝防。簡單的如每次的
new
和dispose
,create
和free
,隱晦一點的如
string
型別的操作。
首先對於
create
和free
,盡量少用。換句話說,盡量少用封裝。適當的封裝是可以的,只要封裝的層次不是太深。
delphi
提供了vcl
原始碼,我們可以看看即使是直接繼承
tobject
那也會多做多少工作!對於頻繁呼叫的函式,不要採用虛函式。這些晚繫結的函式,想呼叫就得查詢
vmt,很費時間。對於類的普通函式,由於進行了早繫結,這個和其他非類的常規一樣,不會降低效率。
其次,相應的,盡量使用結構和函式來代替類。對於結構,
new
和dispose
也要盡量少用。要集中的使用來避免記憶體碎片。我們應該一次性把所預料的記憶體都申請完,伺服器就得有伺服器的樣,放著那麼多記憶體幹什麼。早晚都得申請,為什麼在服務端啟動的時候不一次性申請完,在服務端關閉的時候一次性釋放掉?既避免了記憶體碎片又避免了以後的再申請操作,一舉兩得,何樂而不為?要知道記憶體分配和釋放是非常昂貴的操作。不論是從時間上還是從穩定性上而言。再具體些,怎麼儲存這些申請到的記憶體?怎麼保證在必要的時候可以很方便的再申請或及時的釋放一些記憶體?我採用的是鍊錶。在每次為乙個資料結構申請記憶體的時候,先檢視這個鍊錶是否為空,如果不為空,就從這個鍊錶中取出乙個記憶體塊,不需要真正呼叫函式申請。如果為空,再動態分配。使用完成後,把這個資料結構不釋放,而是再把它插入到鍊錶中去,以便下一次使用。
再次,不用
string
用什麼?用陣列!用字元陣列!就像
c中的字元陣列一樣。就是這麼簡單~
編寫服務端程式的要點
服務端與客戶端絕對是兩碼事。在客戶端我們提倡 create new 和free dispose 隨用隨申請,不用即釋放。但在服務端要盡量避免這樣做。在客戶端可以隨時使用 string 型別,但在服務端也必須盡量避免使用 string string 使用起來異常方便,但我們看看編譯後的 恐怕就會只冒冷...
編寫服務端程式的要點
服務端與客戶端絕對是兩碼事。在客戶端我們提倡 create new 和free dispose 隨用隨申請,不用即釋放。但在服務端要盡量避免這樣做。在客戶端可以隨時使用 string 型別,但在服務端也必須盡量避免使用 string string 使用起來異常方便,但我們看看編譯後的 恐怕就會只冒冷...
編寫服務端程式的要點
服務端與客戶端絕對是兩碼事。在客戶端我們提倡 create new 和free dispose 隨用隨申請,不用即釋放。但在服務端要盡量避免這樣做。在客戶端可以隨時使用 string 型別,但在服務端也必須盡量避免使用 string string 使用起來異常方便,但我們看看編譯後的 恐怕就會只冒冷...