Delphi中文本文件的编写性能 [英] Text File Writing Performance in Delphi

查看:0
本文介绍了Delphi中文本文件的编写性能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的程序正在处理传入的字符串(来自Telnet、HTTP等),我必须使用Delphi XE2将这些字符串写入文本文件以用于日志记录。

有时程序可能会崩溃,而我需要确保剩余的字符串不会丢失,因此我打开/关闭了每个传入字符串的文件,结果出现了一些性能问题。例如,下面的代码需要8秒才能完成。

我的代码包含在下面,有什么方法可以提高性能吗?

(对于下面的测试,只需创建一个具有Button : Button1OnClick事件和Label : lbl1事件的窗体)。

Procedure AddToFile(Source: string; FileName :String);
var
  FText : Text;
  TmpBuf: array[word] of byte;
Begin
  {$I-}
  AssignFile(FText, FileName);
  Append(FText);
  SetTextBuf(FText, TmpBuf);
  Writeln(FText, Source);
  CloseFile(FText);
  {$I+}
end;

procedure initF(FileName : string);
Var  FText : text;
begin
  {$I-}
  if FileExists(FileName) then  DeleteFile(FileName);
  AssignFile(FText, FileName);
  ReWrite(FText);
  CloseFile(FText);
  {$I+}
end;

procedure TForm1.Button1Click(Sender: TObject);
var tTime : TDateTime;
    iBcl : Integer;
    FileName : string;
begin
  FileName := 'c:Test.txt';
  lbl1.Caption := 'Go->' + FileName; lbl1.Refresh;
  initF(FileName);
  tTime := Now;
  For iBcl := 0 to 2000 do
    AddToFile(IntToStr(ibcl) + '   ' +  'lkjlkjlkjlkjlkjlkjlkj' , FileName);
  lbl1.Caption  :=  FormatDateTime('sss:zzz',Now-tTime);
end;

推荐答案

使用TStreamWriter,它会自动缓冲,并可以自动将其缓冲区刷新到TFileStream。它还允许您根据需要选择追加到现有文件,为Unicode支持设置字符编码,并允许您在其各种重载的Create构造函数中设置不同的缓冲区大小(默认为1024字节或1K)。

(请注意,刷新TStreamWriter仅将TStreamBuffer的内容写入TFileStream;它不刷新操作系统文件系统缓冲区,因此在释放TFileStream之前,文件不会实际写入磁盘。)

不要每次都创建StreamWriter;只需创建并打开一次,最后将其关闭:

function InitLog(const FileName: string): TStreamWriter;
begin
  Result := TStreamWriter.Create(FileName, True);
  Result.AutoFlush := True;         // Flush automatically after write
  Result.NewLine := sLineBreak;     // Use system line breaks
end;

procedure CloseLog(const StreamWriter: TStreamWriter);
begin
  StreamWriter.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var 
  tTime : TDateTime;
  iBcl : Integer;
  LogSW: TStreamWriter;
  FileName: TFileName;
begin
  FileName := 'c:Test.txt';
  LogSW := InitLog(FileName);
  try
    lbl1.Caption := 'Go->' + FileName; 
    lbl1.Refresh;
    tTime := Now;

    For iBcl := 0 to 2000 do
      LogSW.WriteLine(IntToStr(ibcl) + '   ' +  'lkjlkjlkjlkjlkjlkjlkj');

    lbl1.Caption  :=  FormatDateTime('sss:zzz',Now - tTime);
  finally
    CloseLog(LogSW);
  end;
end;

这篇关于Delphi中文本文件的编写性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆