home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 February / Chip_2002-02_cd1.bin / zkuste / delphi / nastroje / d23456 / PRODEL.ZIP / PROCAL.PAS < prev    next >
Pascal/Delphi Source File  |  2001-05-05  |  4KB  |  149 lines

  1. //PROFILE-NO
  2. unit Procal;
  3. {$O-}  // Do not remove! Delphi might crash !!!!
  4. {$R-}
  5. {$Q-}
  6. {$A+}
  7.  
  8. interface
  9. USES
  10.   Windows;
  11.  
  12. TYPE
  13. {$IFDEF VER90 }
  14.   TMyComp  = Comp;
  15. {$ELSE }
  16.   {$IFDEF VER100 }
  17.     TMyComp  = Comp;
  18.   {$ELSE }
  19.     TMyComp  = Int64;
  20.   {$ENDIF }
  21. {$ENDIF }
  22.   TMyLargeInteger = RECORD
  23.                     CASE Byte OF
  24.                      0 : ( LowPart  : DWORD; HighPart : LongInt );
  25.                      1 : ( QuadPart : TMyComp );
  26.                   END;
  27.  
  28. FUNCTION TopFunction ( VAR index : Integer ) : TMyLargeInteger;
  29. FUNCTION FunctionWith100( VAR index : Integer ) : TMyLargeInteger;
  30. FUNCTION FunctionWith1000( VAR index : Integer ) : TMyLargeInteger;
  31.  
  32. VAR
  33.   QPCAss : TMyLargeInteger; // Time used for PRTSC + mov + mov
  34. implementation
  35.  
  36. VAR
  37.   tsum   : TMyLargeInteger;
  38.  
  39. FUNCTION DeepFunction : Integer;
  40. BEGIN
  41.   Result := 0;
  42. END;
  43.  
  44. FUNCTION MidFunction  : Integer;
  45. VAR
  46.   i : Integer;
  47. BEGIN
  48.   FOR i := 1 TO 10 DO
  49.     Result := DeepFunction;
  50. END;
  51.  
  52. FUNCTION TopFunction ( VAR index : Integer ) : TMyLargeInteger;
  53. VAR
  54.   i  : Integer;
  55.   ta : TMyLargeInteger;
  56. BEGIN
  57.   asm
  58.     DW 310FH;   // first PRTSC, get cycles before tested instruction
  59.     mov ta.lowpart,eax
  60.     mov ta.highpart,edx
  61.   end;
  62.  
  63.   FOR i := 1 TO 10 DO
  64.     index := MidFunction;
  65.   Result.highpart := 0;
  66.   Result.lowpart := 0;
  67.  
  68.   asm
  69.     DW 310FH;   // get cycles after tested instructions
  70.     // Next lines calculate the no of cycles now - no of cycles before first PRTSC
  71.     sub eax,ta.lowpart
  72.     sbb edx,ta.highpart
  73.     // Next lines subtract no of cycles for the first PRTSC + mov instructions
  74.     sub eax,QPCAss.lowpart
  75.     sbb edx,QPCAss.highpart
  76.     // = No of cycles for the measured instructions
  77.     // stored in tsum
  78.     mov tsum.lowpart,eax
  79.     mov tsum.highpart,edx
  80.   end;
  81.   result.lowpart := tsum.lowpart;
  82. END;
  83.  
  84. FUNCTION FunctionWith100( VAR index : Integer ) : TMyLargeInteger;
  85. VAR
  86.   i  : Integer;
  87.   ta : TMyLargeInteger;
  88. BEGIN
  89.   asm
  90.     DW 310FH;   // first PRTSC, get cycles before tested instruction
  91.     mov ta.lowpart,eax
  92.     mov ta.highpart,edx
  93.   end;
  94.   Result.lowpart  := 0;
  95.   Result.highpart := 0;
  96.  
  97.   FOR i := 1 TO 100 DO
  98.     INC(index);
  99.  
  100.   asm
  101.     DW 310FH;   // get cycles after tested instructions
  102.     // Next lines calculate the no of cycles now - no of cycles before first PRTSC
  103.     sub eax,ta.lowpart
  104.     sbb edx,ta.highpart
  105.     // Next lines subtract no of cycles for the first PRTSC + mov instructions
  106.     sub eax,QPCAss.lowpart
  107.     sbb edx,QPCAss.highpart
  108.     // = No of cycles for the measured instructions
  109.     // stored in tsum
  110.     mov tsum.lowpart,eax
  111.     mov tsum.highpart,edx
  112.   end;
  113.   result.lowpart := tsum.lowpart;
  114. END;
  115.  
  116. FUNCTION FunctionWith1000( VAR index : Integer ) : TMyLargeInteger;
  117. VAR
  118.   i  : Integer;
  119.   ta : TMyLargeInteger;
  120. BEGIN
  121.   asm
  122.     DW 310FH;   // first PRTSC, get cycles before tested instruction
  123.     mov ta.lowpart,eax
  124.     mov ta.highpart,edx
  125.   end;
  126.   Result.lowpart  := 0;
  127.   Result.highpart := 0;
  128.  
  129.   FOR i := 1 TO 1000 DO
  130.     INC(index);
  131.  
  132.   asm
  133.     DW 310FH;   // get cycles after tested instructions
  134.     // Next lines calculate the no of cycles now - no of cycles before first PRTSC
  135.     sub eax,ta.lowpart
  136.     sbb edx,ta.highpart
  137.     // Next lines subtract no of cycles for the first PRTSC + mov instructions
  138.     sub eax,QPCAss.lowpart
  139.     sbb edx,QPCAss.highpart
  140.     // = No of cycles for the measured instructions
  141.     // stored in tsum
  142.     mov tsum.lowpart,eax
  143.     mov tsum.highpart,edx
  144.   end;
  145.   result.lowpart := tsum.lowpart;
  146. END;
  147.  
  148. end.
  149.