Delphi BASE64單元EncdDecd的修改

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;
相關文章
相關標籤/搜索