Contributor: MARNIX TIMMERMANS
{
> Is there any difference in speed between blockreading a given number of
> bytes with a recordlength of 1 and a bigger recordlength, something like
> reset(file1,1);
> reset(file2,256);
> blockread(file1,Buffer^,32768);
> blockread(file2,Buffer^,128);
> Oh yes, it is !
No, the buffer is equally big in both cases (128*256 = 32768).
> With the biggest buffer you have the shortest reading-time, simple isn't
> it? Try to test it with an easy copy-program.
> First with reset(file,1), then with reset(file,4096) or 8192 or 32768.
> Now copy a big file (over 1 MB) an take a look on your watch.
I've changed some program I've made and it doesn't make any difference.
Look at comment:
}
program HD2;
{$R-,S-}
uses Dos;
const
MaxDirSize = 512;
BufSize = 32768;
var
buf: array[1..BufSize] of byte;
MinSize, TotSize, Tdiff, diff, timer1, timer2, Tsize, size : longint;
Count,Iter, MaxIter : word;
Dir: DirStr;
path : pathstr;
srec : searchrec;
options : string;
function capslock(doelwit : string) : string;
var i : integer;
begin
for i := 1 to length(doelwit) do
if doelwit[i] in ['a'..'z'] then
doelwit[i] := chr(ord(doelwit[i])-32);
capslock := doelwit;
end;
procedure LogTime( var ti : longint);
var
ho,mi,se,hund : word;
begin
GetTime(ho,mi,se,hund);
Ti := hund+se*100+mi*6000+ho*360000;
end;
function ReadNumber(t:byte; s:string): word;
var
nm:string;
rn: word;
code: integer;
begin
nm := '';
inc(t,2);
while (t<=length(s)) and (s[t] in ['0'..'9']) do
begin
Nm := Nm + s[t];
inc(t);
end;
Val( Nm, rn, code);
if code=0 then
ReadNumber := Rn
else
ReadNumber := 0;
end;
procedure Init;
begin
TotSize := 128;
MaxIter := 10;
MinSize := 1;
Tdiff := 0; Tsize := 0;
options := '';
path := '';
end;
procedure Help;
begin
writeln('Syntax: HD [filename] [options]');
writeln;
writeln('/Mxxxx : Minimum filesize for files to be tested');
writeln('/Txxxx : Total size in Kb per file read (default = 128 kb)');
writeln('/Ixxxx : Maximum iterations');
writeln('/? : This helptext');
writeln;
writeln('This programs measures how fast the specified file can be read into memory');
writeln('and then the transfer rate is been calculated. If a file is smaller than');
writeln( TotSize, ' Kb the file will be read more than once to accomplish more reliable results.');
halt;
end;
procedure GetParams;
var
t:byte;
f:file;
Attr:word;
N:NameStr;
E:ExtStr;
begin
for t := 1 to ParamCount do
if Copy(ParamStr(t),1,1) <> '/' then
path := ParamStr(t)
else
options := options + paramstr(t);
t := 1;
while t < length(options) do
begin
if options[t]='/' then
begin
case upcase(options[t+1]) of
'T': if ReadNumber(t,options) <>0 then TotSize := ReadNumber(t,options);
'M': if ReadNumber(t,options) <>0 then MinSize := ReadNumber(t,options);
'I': if ReadNumber(t,options) <>0 then MaxIter := ReadNumber(t,options);
'?': Help;
end;
end;
inc(t);
end;
writeln('Min. size: ', MinSize, ' Kb');
writeln('Total size: ', TotSize, ' Kb');
writeln('Iterations: ', MaxIter);
writeln;
Path := FExpand(Path);
if Path[Length(Path)] <> '\' then
begin
Assign(F, Path);
GetFAttr(F, Attr);
if (DosError = 0) and (Attr and Directory <> 0) then
Path := Path + '\';
end;
FSplit(Path, Dir, N, E);
if N = '' then N := '*';
if E = '' then E := '.*';
Path := Dir + N + E;
writeln('Path: ', Path);
writeln;
end;
procedure GetBench;
var
F:File;
sr : SearchRec;
t : word;
NumRead: Word;
iterstr : string;
begin
Count := 0;
FindFirst(Path, Archive, sr);
while (DosError = 0) and (Count < MaxDirSize) do
begin
if (sr.attr and ReadOnly) <> ReadOnly then
begin
assign(f, dir+sr.name);
size := sr.size;
if sizeMaxIter then Iter := MaxIter;
write( copy(sr.name+' ',1,13));
if iter > 1 then
begin
str( iter, iterstr);
write( '('+iterstr+'x)' : 6)
end
else
write( ' ' : 6);
LogTime( timer1);
for t := 1 to iter do
begin
Reset(F,1); { COMMENT: 'reset (f,512)' }
repeat
BlockRead(F, buf, SizeOf(buf), NumRead);
{ COMMENT: and 'SizeOf(Buf) div 512' doesn't make any difference }
until (NumRead = 0);
Close(F);
end;
LogTime( Timer2);
diff := Timer2-timer1;
write( ' ', size*iter : 6, ' bytes in ', diff/100 : 5 : 2, ' sec. ');
if Diff>0 then
writeln( 'Transfer speed ', iter*size/diff/10.24 : 3 : 1,
' Kb/sec.')
else
writeln;
inc( Tdiff, diff);
inc( Tsize, size*iter);
inc( count);
end;
FindNext(sr);
end;
end;
begin
writeln;
writeln('HD Transfer Speed Timer v2.0 * (c)1991,1993 Marnix Timmermans');
writeln;
Init;
GetParams;
GetBench;
writeln;
writeln( 'Totals of ',count:5,' files : ', Tsize, ' bytes in ', Tdiff/100 : 5 : 2, ' sec. ');
if TDiff <> 0 then
writeln( 'Average Transfer speed: ', Tsize/Tdiff/10.24 : 3 : 1, ' Kb/sec.');
end.