Registriert seit: 6. Mär 2013
6.159 Beiträge
Delphi 10 Seattle Enterprise
|
AW: BlockRead, BlockWrite und die richtige Buffer-Größe
23. Aug 2016, 20:37
Hier ein kleiner Test. Wenn ich hier auf ein Netzlaufwerk schreibe ist der TFileStream sogar schneller. Und mit einer anderen Blockgröße sogar noch schneller.
Zitat:
Time taken for block write: 2693 ms
Time taken for filestream, block size = 1: 8647 ms
Time taken for filestream, block size = 1024: 1341 ms
Time taken for filestream, block size = 50 * 4096: 1631 MS
Delphi-Quellcode:
program BlockWriteBenchmarkProject;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Diagnostics,
System.IoUtils,
System.Classes
;
const
filePath = 'T:\benchmark';
bytesToWrite = 100 * 1024 * 1024; // 100 MB
var
fileStreamBlockSize: Integer;
procedure measureTime(const proc: TProcedure; const title: String);
var
stopWatch: TStopwatch;
begin
stopWatch := TStopwatch.StartNew();
proc();
stopWatch.Stop();
WriteLn('Time taken for ', title, ': ', stopWatch.ElapsedMilliseconds, ' ms');
end;
procedure blockWriteThings();
const
blockSize = 50 * 4096;
var
legacyFile: file;
buffer: TBytes;
bytesWritten: Int64;
begin
SetLength(buffer, blockSize);
bytesWritten := 0;
AssignFile(legacyFile, filePath+'\blockwrite.abc');
Rewrite(legacyFile, 1);
try
repeat
BlockWrite(legacyFile, buffer[0], blockSize);
Inc(bytesWritten, blockSize);
until (bytesWritten = bytesToWrite);
finally
CloseFile(legacyFile)
end;
end;
procedure fileStreamThings();
var
fileStream: TStream;
bytesWritten: Int64;
buffer: TBytes;
begin
SetLength(buffer, fileStreamBlockSize);
bytesWritten := 0;
fileStream := TFile.Open(filePath + '\fileStream.abc', TFileMode.fmOpenOrCreate);
try
repeat
fileStream.WriteData(buffer, fileStreamBlockSize);
Inc(bytesWritten, fileStreamBlockSize)
until (bytesWritten = bytesToWrite);
finally
fileStream.Destroy();
end;
end;
begin
measureTime(blockWriteThings, 'block write');
fileStreamBlockSize := 1024;
measureTime(fileStreamThings, 'filestream, block size = 1');
fileStreamBlockSize := 1024 * 100;
measureTime(fileStreamThings, 'filestream, block size = 1024');
fileStreamBlockSize := 50 * 4096;
measureTime(fileStreamThings, 'filestream, block size = 50 * 4096');
readln;
end.
Jetzt bleibt nur noch die Frage, wie man die Blockgröße wählen sollte wenn man z.B. weiß dass man 100 MB schreiben möchte. Ich habe da nämlich auch keine Ahnung
|
|
Zitat
|