[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]