文本文件在Delphi中编写性能

phi*_*ext 4 delphi performance file-io delphi-xe2

我的软处理传入的字符串(来自Telnet或HTTP或......),我必须用Delphi XE2编写文本文件,以获得一些处理过的字符串.因为有时字符串可能会崩溃程序我需要确保在我的文件中有字符串.所以我打开/关闭每个传入字符串的文件,我有一些性能问题.通常(对于我的代码测试)为8秒

我的代码在这里,有没有办法改善保持功能的性能?(对于测试,只需使用Button创建一个Form:Button1,OnClick事件和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;
Run Code Online (Sandbox Code Playgroud)

Ken*_*ite 14

使用a TStreamWriter,它是自动缓冲的,并且可以自动处理其缓冲区TFileStream.如果需要,它还允许您选择附加到现有文件,为Unicode支持设置字符编码,并允许您在其各种重载Create构造函数中设置不同的缓冲区大小(默认值为1024字节或1K).

(请注意,冲洗TStreamWriter只写的内容TStreamBufferTFileStream;它不刷新操作系统的文件系统缓存,所以文件实际上并未写入磁盘,直到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;
Run Code Online (Sandbox Code Playgroud)