TFileStream сам по себе не выполняет буферизацию, которая обрабатывается ОС и обычно достаточна для большинства целей.
Я бы предложил создать метод для записи ваших данных в поток, а затем передать параметр TSTream этому методу. Таким образом, вы можете легко тестировать различные опции, не влияя на вашу программу.
Например:
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;
В JCL, как упоминалось ранее, есть TJclBufferedStream, с которым вы можете затем протестировать, чтобы увидеть, есть ли какое-либо преимущество в производительности, которое будет зависеть от того, что вы пишете, и сколько вы пишете. Например, следующий код протестирует TFileStream и tJCLBufferedStream, чтобы увидеть, в чем заключаются различия (да, я знаю, что мне не хватает TRY / FINALLY):
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;
в моем тесте следующая процедура:
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;
вернул 47 для tFilestream и 16 для tJCLBufferedStream. Без цикла время незначительно, поэтому вам нужно проверить свои данные ... и сколько вы пишете.