Ano taki mądry jestem. Co więcej potrafię myśleć i nawet podstawowe operacje matematyczne nie są mi obce.
Ja u siebie mam średnią prędkość podczas kopiowania plików na poziomie 65MB/s. Przy 1400MB pliku daje to 1400 / 65 = 21 sekund
plik 1 458 346 369 bytes windows kopiował ~28s
procedure TForm1.Button1Click(Sender: TObject);
var
infs, outfs: TFileStream;
s: TDateTime;
begin
infs := TFileStream.Create('f:\a\in.mp4', fmOpenRead);
outfs := TFileStream.Create('f:\a\out.mp4', fmCreate);
try
s := Now;
outfs.CopyFrom(infs, infs.Size);
ShowMessage(FormatDateTime('nn:ss:zzz', Now - s));
finally
outfs.Free;
infs.Free;
end;
end;
kopiowało ~27sek
procedure TForm1.Button2Click(Sender: TObject);
const
bs = 1024*1024*10;
var
infs, outfs: TFileStream;
bufs: Integer;
buf: PChar;
s: TDateTime;
count: Integer;
begin
infs := TFileStream.Create('f:\a\in.mp4', fmOpenRead);
outfs := TFileStream.Create('f:\a\out.mp4', fmCreate);
GetMem(buf, bs);
try
count := infs.Size;
s := Now;
while count > 0 do
begin
if count > bs then bufs := bs else bufs := count;
infs.ReadBuffer(buf^, bufs);
outfs.WriteBuffer(buf^, bufs);
Dec(count, bufs);
end;
ShowMessage(FormatDateTime('nn:ss:zzz', Now - s));
finally
outfs.Free;
infs.Free;
FreeMem(buf);
end;
end;
kopiowało ~28 sek
procedure TForm1.Button3Click(Sender: TObject);
const
BUFSIZE = 10 * 1048576; //n * 1 MB
//Przy pliku ~1400 MB
//rozmiar buffera 1 MB 00:01:30, 10 MB 00:01:00, 50 MB 00:00:40
//100 MB 00:00:40 (tak jak 50), 200 MB 00:00:52
var
fs, fd: TFileStream;
buf: PChar;
count: Cardinal;
s: TDateTime;
begin
buf:= AllocMem(BUFSIZE);
try
fs:= TFileStream.Create('f:\a\in.mp4', fmOpenRead
or fmShareDenyWrite);
try
fd:= TFileStream.Create('f:\a\out.mp4', fmCreate or fmOpenWrite
or fmShareExclusive);
try
s := Now;
repeat
count:= fs.Read(buf^, BUFSIZE);
fd.Write(buf^, count);
until (count = 0);
ShowMessage(FormatDateTime('nn:ss:zzz', Now - s));
finally
fd.Free;
end;
finally
fs.Free;
end;
finally
FreeMem(buf);
end;
end;
kopiowało ~28 sek
gdzie tu masz jakieś różnice, pomijając +-1 sek jeśli system coś akurat robił. To, że u ciebie coś c**** działa nie oznacza wcale, że działa tak u wszystkich! Co więcej czy bufor będzie 1MB, 10MB czy 100MB to czasy się praktycznie nie różnią!