Delphi BASE64單元EncdDecd的修改函數
EncdDecd.pas兩個函數聲明:性能
procedure EncodeStream(Input, Output: TStream);
procedure DecodeStream(Input, Output: TStream);測試
對於Output參數,若是是TMemoryStream,效率真是太糟糕了,測試發現,編碼一個5M多的文件,要十幾秒鐘!編碼
但若是是TStringStream,只要0.2~0.3秒! code
WHY?blog
由於TMemoryStream在不斷地調用Write方法,不斷地向Windows要求分配內存!從而致使性能降低!而TStringStream和TFileStream則沒有這個問題。內存
怎麼辦?it
能夠一次性給TMemoryStream分配好內存空間。假設編碼前的字節數爲X,那麼編碼後的字節數爲 (X + 2) div 3 * 4class
關於回車換行符的修改,找到下面這段代碼:效率
if K > 75 then begin BufPtr[0] := #$0D; // 回車 BufPtr[1] := #$0A; // 換行 Inc(BufPtr, 2); K := 0; end;
每隔76個字符,就強制回車換行。將其註釋掉, 由於這實際上是沒什麼用。將修改的單元另存爲EncdDecdEx,之後就使用它了。
在編碼/解碼前對Output參數的TMemoryStream事先設置緩衝區大小,避免分屢次向WINDOWS申請內存分配:
uses encddecdEx; var Input,Output:TMemoryStream; begin Input:=TMemoryStream.Create; try Input.LoadFromFile('c:\aaa.txt'); Output:=TMemoryStream.Create; try Output.Size:=(Input.Size + 2) div 3 * 4; EncodeStream(Input,Output); finally Output.Free; end; finally Input.Free; end; end;