Delphi中文本文件的编写性能 [英] Text File Writing Performance in Delphi
本文介绍了Delphi中文本文件的编写性能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的程序正在处理传入的字符串(来自Telnet、HTTP等),我必须使用Delphi XE2将这些字符串写入文本文件以用于日志记录。
有时程序可能会崩溃,而我需要确保剩余的字符串不会丢失,因此我打开/关闭了每个传入字符串的文件,结果出现了一些性能问题。例如,下面的代码需要8秒才能完成。我的代码包含在下面,有什么方法可以提高性能吗?
(对于下面的测试,只需创建一个具有Button : 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;
推荐答案
使用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屋!
查看全文