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.


AltStyle によって変換されたページ (->オリジナル) /