Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
FreePascal / Lazarus
|
AW: Memory leak durch funktion readln
13. Mär 2015, 00:22
Tja wer mißt misst Mist:
Datei schreiben:
ticks für file1: 998
ticks für file2: 9079
ticks für file1: 5304
ticks für file2: 9313
ticks für file1: 8346
ticks für file2: 10093
Datei lesen:
readticks für file1: 515
readticks für file2: 32
readticks für file1: 515
readticks für file2: 15
readticks für file1: 499
readticks für file2: 31
und hier der Source: (der Mißbrauch von written sei mir vergeben):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
file1='c:\temp\f1.bin';
file2='c:\temp\f2.bin';
buffersize=8192;
maxblocks=$FFFF;
var
i : integer;
fn1,
fn2 : tfilestream;
dat1,
dat2 : file;
buffer : array [0..buffersize-1] of byte;
sz1,sz2 : integer;
ez1,ez2 : integer;
written : integer;
begin
assignfile(dat1,file1);
rewrite(dat1,1);
fillchar(buffer,buffersize,'A');
sz1:=gettickcount;
for i:=0 to maxblocks do blockwrite(dat1,buffer,buffersize);
ez1:=gettickcount;
closefile(dat1);
memo1.Lines.Add(format('ticks für file1: %d',[ez1-sz1]));
fn1:=tfilestream.Create(file2,fmcreate or fmshareexclusive );
sz2:=gettickcount;
for i:=0 to maxblocks do written:=fn1.Write(buffer,buffersize);
ez2:=gettickcount;
fn1.Free;
memo1.Lines.Add(format('ticks für file2: %d',[ez2-sz2]));
end;
procedure TForm1.Button2Click(Sender: TObject);
const
file1='c:\temp\f1.bin';
file2='c:\temp\f2.bin';
buffersize=8192;
maxblocks=$FFFF;
var
i : integer;
fn1,
fn2 : tfilestream;
dat1,
dat2 : file;
buffer : array [0..buffersize-1] of byte;
sz1,sz2 : integer;
ez1,ez2 : integer;
written : integer;
begin
assignfile(dat1,file1);
reset(dat1,1);
fillchar(buffer,buffersize,'A');
sz1:=gettickcount;
for i:=0 to maxblocks do blockread(dat1,buffer,buffersize);
ez1:=gettickcount;
closefile(dat1);
memo1.Lines.Add(format('readticks für file1: %d',[ez1-sz1]));
fn1:=tfilestream.Create(file2,fmopenread or fmshareexclusive );
sz2:=gettickcount;
for i:=0 to maxblocks do written:=fn1.Write(buffer,buffersize);
ez2:=gettickcount;
fn1.Free;
memo1.Lines.Add(format('readticks für file2: %d',[ez2-sz2]));
end;
Wenn ich beim reset/rewrite statt 1 buffersize nutze, gibt es keine signifikante Abweichung.
Ach ja W7-64 und die Festplatte in meinem Laptop.
Die paar hunderstel Unterschied, die Du gemessen hast, würde ich übrigens als Meßfehler abhaken.
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
Geändert von p80286 (13. Mär 2015 um 00:28 Uhr)
|
|
Zitat
|