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只写的内容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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7914 次 |
| 最近记录: |