Delphi BASE64单元EncdDecd的修改


本文整理自网络,侵删。

 

EncdDecd.pas两个函数声明:

procedure EncodeStream(Input, Output: TStream);
procedure DecodeStream(Input, Output: TStream);

对于Output参数,如果是TMemoryStream,效率真是太糟糕了,测试发现,编码一个5M多的文件,要十几秒钟!

但如果是TStringStream,只要0.2~0.3秒!

WHY?

因为TMemoryStream在不断地调用Write方法,不断地向Windows要求分配内存!从而导致性能下降!而TStringStream和TFileStream则没有这个问题。

怎么办?

可以一次性给TMemoryStream分配好内存空间。假设编码前的字节数为X,那麽编码后的字节数为 (X + 2) div 3 * 4

关于回车换行符的修改,找到下面这段代码:


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;

来源:https://www.cnblogs.com/hnxxcxg/p/11100160.html

相关阅读 >>

Delphi 以低用户权限启动一个进程.比如vista或者win7中的ie

Delphi xe7 ios 取得系统字型名称

Delphi tidhttp 超时的解决方案

Delphi 计算l两个日期的时间间隔月数,月数差

Delphi fmx 从app程序直接跳转到支付宝付款转帐页面

Delphi 拖动文件到exe 打开 获取getcommandline命令行

Delphi 获取鼠标当前位置的相对坐标

Delphi获取硬件信息

Delphi 判断上午还是下午

Delphi firedac fdconnection 事务

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...