TFileStream 자체는 버퍼링을 수행하지 않으며, 이는 OS에 의해 처리되며 일반적으로 대부분의 목적으로 충분합니다.
내 제안은 데이터를 스트림에 쓰고이 메서드에 TSTream 매개 변수를 전달하는 메서드를 작성하는 것입니다. 이 방법을 사용하면 프로그램에 영향을 미치지 않고 다른 옵션을 쉽게 테스트 할 수 있습니다. 예를 들어
: 이전에 언급 된 JCL에서
Procedure TForm1.StreamMyObjects(aStream : tStream);
begin
aStream.Write(MyString[1], Length(MyString) * SizeOf(Char));
aStream.Write(CRLF, Length(CRLF) * SizeOf(Char));
aStream.Write(MyOtherString[1], Length(MyOtherString) * SizeOf(Char));
aStream.Write(CRLF, Length(CRLF) * SizeOf(Char));
end;
은, 당신이 다음 어떤 성능 이점이 있는지에 대한 테스트, 무엇을 당신의 쓰기에 따라 달라질 수있는 TJclBufferedStream있다 그리고 얼마나 많이 쓰는지. 루틴 다음 내 테스트에서
var
fstm : tFileSTream;
fBufStm : tJCLBufferedStream;
iTicks : Cardinal;
fModes : word; // for SO formatting.
begin
fModes := fmOpenReadWrite or fmCreate or fmShareExclusive;
iTicks := GetTickCount;
fstm := tFilestream.create('test1.txt',fModes);
StreamMyObjects(fStm);
fstm.free;
ShowMessage('TEST1='+IntToSTr(GetTickCount-iTicks));
iTicks := GetTickCount;
fstm := tFilestream.create('test2.txt',fModes);
fBufStm := tJclBufferedStream.create(fStm);
StreamMyObjects(fBufStm);
fBufStm.free;
fstm.free;
ShowMessage('TEST2='+IntToSTr(GetTickCount-iTicks));
end;
: 예를 들어 (그래 난 내가 TRY/마침내 누락 알고) 다음은 TFileStream을을 테스트하고, tJCLBufferedStream 차이점이 무엇인지 볼 수
을
procedure TForm1.StreamMyObjects(aSTream: tStream);
var
St : string;
ix : integer;
begin
for ix := 0 to 10000 do
begin
St := 'This is a string which is written to a stream. ' + IntToStr(ix);
aStream.Write(st[1], Length(st) * SizeOf(Char));
end;
end;
은 tFilestream에 대해 47, tJCLBufferedStream에 대해 16을 반환합니다. 루프가 없으면 시간은 중요하지 않습니다. 따라서 데이터와 비교하여 테스트해야합니다.
안녕 필
라이언, 당신이 어떤 버퍼링을 사용하게 했습니까? 나는 버퍼링이 파일에 나의 쓰기를 가속화 할 것인지에 관해 궁금하게 생각하고있는이 페이지를 가로 질러 할 수있다. 저는 수백만 개의 큰 정수를 파일로 작성하고 TaaWriteBufferFilter를 시도해 보았습니다. 라이언은 Ryan과 연결하여 Win XP Pro에서 파일 저장 시간을 약 6 초로 줄였습니다. 따라서 작은 글을 많이 작성한다면 TFileStream을 버퍼링 된 스트림으로 래핑하는 것이 도움이되는지 확인하는 데 몇 분 정도 시간을 할애 할 가치가 있다고 말하고 싶습니다. 감사 : D – CodeAndCats