[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]
{
ÝIs there an easy way to time functions and/or procedures?? I'm trying
Ýto compare a couple functions that do the samething and I would like to
Ýtime them. I've tried using the GetTime procedure but the hundredths of
Ýseconds isn't fast enough. Can any one help?
I think this unit may help you:
***************************************************************************
}
unit tptimer;
interface
procedure cardinal(l:longint; var result:double);
procedure elapsedtime(start:longint; stop:longint; var result:double);
(*Calculate time elapsed (in milliseconds) between Start and Stop*)
procedure initializetimer;
(*Reprogram the timer chip to allow 1 microsecond resolution*)
procedure restoretimer;
(*Restore the timer chip to its normal state*)
function readtimer:longint;
(*Read the timer with 1 microsecond resolution*)
implementation
uses dos;
const
TimerResolution=1193181.667;
procedure cardinal(l:longint; var result:double);
Begin
if l < 0 then result:= l + 4294967296.0
else
result := l;
End;
procedure elapsedtime(start, stop:longint; var result:double);
var r:double;
Begin
cardinal(stop - start, r);
result := (1000 * r) / TimerResolution;
End;
procedure initializetimer;
label NullJump1,NullJump2;
Begin
port[$043]:=$034;
asm jmp NullJump1;
NullJump1:
end;
port[$040]:=$000;
asm jmp NullJump2
NullJump2:
end;
port[$040]:=$000;
End;
procedure restoretimer;
label NullJump1,NullJump2;
Begin
port[$043]:=$036;
asm jmp NullJump1;
NullJump1:
end;
port[$040]:=$000;
asm jmp NullJump2
NullJump2:
end;
port[$040]:=$000;
End;
function readtimer:longint; assembler;
label done;
Asm
cli (* Disable interrupts *)
mov dx,020h (* Address PIC ocw3 *)
mov al,00Ah (* Ask to read irr *)
out dx,al
mov al,00h (* Latch timer 0 *)
out 043h,al
in al,dx (* Read irr *)
mov di,ax (* Save it in DI *)
in al,040h (* Counter --> bx*)
mov bl,al (* LSB in BL *)
in al,040h
mov bh,al (* MSB in BH *)
not bx (* Need ascending counter *)
in al,021h (* Read PIC imr *)
mov si,ax (* Save it in SI *)
mov al,00FFh (* Mask all interrupts *)
out 021h,al
mov ax,040h (* read low word of time *)
mov es,ax (* from BIOS data area *)
mov dx,es:[06Ch]
mov ax,si (* Restore imr from SI *)
out 021h,al
sti (* Enable interrupts *)
mov ax,di (* Retrieve old irr *)
test al,001h (* Counter hit 0? *)
jz done (* Jump if not *)
cmp bx,0FFh (* Counter > 0x0FF? *)
ja done (* Done if so *)
inc dx (* Else count int req. *)
done:
mov ax,bx (* set function result *)
End;
End.
***********************************************************************
and here is a program to test the unit:
Program TestTime;
uses crt, dos, tptimer;
var start_time, stop_time: longint;
time:double;
Begin
Clrscr;
initializetimer;
delay(100);
start_time:=readtimer;
delay(2);
stop_time:=readtimer;
elapsedtime(start_time, stop_time, time);
writeln('elapsed time = ', time:0:10);
readln;
restoretimer;
End.
[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]