home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / piwg / a000032.ada < prev    next >
Encoding:
Text File  |  1988-05-03  |  5.6 KB  |  167 lines

  1. -- Iteration control package body
  2.  
  3. with CPU_TIME_CLOCK ;  -- various choices on tape
  4. with CALENDAR ; -- used for WALL clock times
  5. with SYSTEM ; -- used to get value of TICK
  6. with TEXT_IO ;  -- only for diagnostics
  7.  
  8. package body ITERATION is -- A000032.ADA
  9.  
  10. --
  11. -- CPU time variables
  12. --
  13.   CONTROL_TIME_INITIAL : DURATION ; -- sampled from CPU_TIME_CLOCK at beginning
  14.   CONTROL_TIME_FINAL : DURATION ;  -- sampled from CPU_TIME_CLOCK at end
  15.   CONTROL_DURATION : DURATION ; -- (FINAL-INITIAL) the measured time in seconds
  16.   TEST_TIME_INITIAL : DURATION ; -- ditto for TEST
  17.   TEST_TIME_FINAL : DURATION ;
  18.   TEST_DURATION : DURATION ;
  19. --
  20. -- WALL time variables
  21. --
  22.   WALL_CONTROL_TIME_INITIAL : DURATION ; -- sampled from CLOCK at beginning
  23.   WALL_CONTROL_TIME_FINAL : DURATION ;  -- sampled from CLOCK at end
  24.   WALL_CONTROL_DURATION : DURATION ; -- (FINAL-INITIAL) measured time in seconds
  25.   WALL_TEST_TIME_INITIAL : DURATION ; -- ditto for TEST
  26.   WALL_TEST_TIME_FINAL : DURATION ;
  27.   WALL_TEST_DURATION : DURATION ;
  28. --
  29.   MINIMUM_TIME : DURATION := 1.0 ; -- required minimum value of test time
  30. --  MINIMUM_TIME : DURATION := 10.0 ; -- suggested minimum value for fast machines
  31.   TEMP_TIME : FLOAT ; -- for scaling to microseconds
  32.   ITERATION_COUNT : INTEGER ;  -- change to make timing stable
  33.   CHECK : INTEGER ; -- saved from STOP_TEST call for scaling
  34.  
  35.   procedure START_CONTROL is
  36.   begin
  37.     CONTROL_TIME_INITIAL := CPU_TIME_CLOCK ;
  38.     WALL_CONTROL_TIME_INITIAL := CALENDAR.SECONDS(CALENDAR.CLOCK) ;
  39.   end START_CONTROL ;
  40.  
  41.   procedure STOP_CONTROL ( GLOBAL : INTEGER ;
  42.                            CHECK : INTEGER ) is
  43.   begin
  44.     CONTROL_TIME_FINAL := CPU_TIME_CLOCK ;
  45.     CONTROL_DURATION := CONTROL_TIME_FINAL - CONTROL_TIME_INITIAL ;
  46.     WALL_CONTROL_TIME_FINAL := CALENDAR.SECONDS(CALENDAR.CLOCK) ;
  47.     WALL_CONTROL_DURATION := WALL_CONTROL_TIME_FINAL -
  48.                              WALL_CONTROL_TIME_INITIAL ;
  49. --
  50.     if CHECK /= GLOBAL then
  51.       TEXT_IO.PUT_LINE ( " Fix control loop before making measurements." ) ;
  52.       TEXT_IO.PUT_LINE ( INTEGER'IMAGE ( GLOBAL ) & " = GLOBAL " ) ;
  53.       raise PROGRAM_ERROR ;
  54.     end if ;
  55.   end STOP_CONTROL ;
  56.  
  57.   procedure START_TEST is
  58.   begin
  59.     TEST_TIME_INITIAL := CPU_TIME_CLOCK ;
  60.     WALL_TEST_TIME_INITIAL := CALENDAR.SECONDS(CALENDAR.CLOCK) ;
  61.   end START_TEST ;
  62.  
  63.   procedure STOP_TEST ( GLOBAL : INTEGER ;
  64.                         CHECK : INTEGER ) is
  65.   begin
  66.     TEST_TIME_FINAL := CPU_TIME_CLOCK ;
  67.     TEST_DURATION := TEST_TIME_FINAL - TEST_TIME_INITIAL ;
  68.     WALL_TEST_TIME_FINAL := CALENDAR.SECONDS(CALENDAR.CLOCK) ;
  69.     WALL_TEST_DURATION := WALL_TEST_TIME_FINAL - WALL_TEST_TIME_INITIAL ;
  70. --
  71.     ITERATION.CHECK := CHECK ;
  72.     if CHECK /= GLOBAL then
  73.       TEXT_IO.PUT_LINE ( " Fix test loop before making measurements." ) ;
  74.       TEXT_IO.PUT_LINE ( INTEGER'IMAGE ( GLOBAL ) & " = GLOBAL " ) ;
  75.       raise PROGRAM_ERROR ;
  76.     end if ;
  77.   end STOP_TEST ;
  78.  
  79.   procedure FEATURE_TIMES ( CPU_TIME : out DURATION ;
  80.                             WALL_TIME : out DURATION ) is
  81.   begin
  82. --
  83. --  compute scaled results
  84. --
  85.     begin
  86. --      choose 1st and 3rd to uncomment, 2nd and 4th to comment if overflow
  87. --      TEMP_TIME := FLOAT ( TEST_DURATION - CONTROL_DURATION ) ;
  88.       TEMP_TIME := FLOAT ( (TEST_DURATION-CONTROL_DURATION)*1000 ) ;
  89. --      TEMP_TIME := (1_000_000.0 * TEMP_TIME) / 
  90.       TEMP_TIME := (1_000.0 * TEMP_TIME) / 
  91.                    ( FLOAT ( ITERATION_COUNT ) * FLOAT (CHECK) );
  92.       if TEMP_TIME < 0.0 then
  93.         CPU_TIME := 0.0 ;
  94.       else
  95.         CPU_TIME := DURATION ( TEMP_TIME ) ;
  96.       end if ;
  97.     exception
  98.       when others =>  -- bail out if trouble in conversion
  99.         CPU_TIME := 0.0 ;
  100.     end ;
  101. --
  102.     begin
  103. --      choose 1st and 3rd to uncomment, 2nd and 4th to comment if overflow
  104. --      TEMP_TIME := FLOAT ( WALL_TEST_DURATION - WALL_CONTROL_DURATION ) ;
  105.       TEMP_TIME := FLOAT ( (WALL_TEST_DURATION-WALL_CONTROL_DURATION)*1000 ) ;
  106. --      TEMP_TIME := (1_000_000.0 * TEMP_TIME) / 
  107.       TEMP_TIME := (1_000.0 * TEMP_TIME) / 
  108.                    ( FLOAT ( ITERATION_COUNT ) * FLOAT (CHECK) );
  109.       if TEMP_TIME < 0.0 then
  110.         WALL_TIME := 0.0 ;
  111.       else
  112.         WALL_TIME := DURATION ( TEMP_TIME ) ;
  113.       end if ;
  114.     exception
  115.       when others =>
  116.         WALL_TIME := 0.0 ;
  117.     end ;
  118.  
  119.   end FEATURE_TIMES ;
  120.  
  121.  
  122.   procedure INITIALIZE ( ITERATION_COUNT : out INTEGER ) is
  123.   begin
  124.     ITERATION_COUNT := 1 ;
  125.     ITERATION.ITERATION_COUNT := 1 ;
  126.   end INITIALIZE ;
  127.  
  128.   procedure TEST_STABLE ( ITERATION_COUNT : in out INTEGER ;
  129.                           STABLE : out BOOLEAN ) is
  130.   begin
  131.     if TEST_DURATION > MINIMUM_TIME then
  132.       if TEST_DURATION < CONTROL_DURATION and ITERATION_COUNT < 1024 then
  133.         STABLE := FALSE ;
  134.       else
  135.         STABLE := TRUE ;
  136.       end if ;
  137.     elsif ITERATION_COUNT >= 16384 then
  138.       TEXT_IO.PUT_LINE ( "***** INCOMPLETE MEASUREMENT *****" ) ;
  139.       STABLE := TRUE ;
  140.     else
  141.       ITERATION_COUNT := ITERATION_COUNT + ITERATION_COUNT ;
  142.       ITERATION.ITERATION_COUNT := ITERATION_COUNT ;
  143.       STABLE := FALSE ;
  144.     end if;  
  145.   end TEST_STABLE ;
  146.  
  147.  
  148. --
  149. begin
  150.  
  151.   if SYSTEM.TICK * 100 > MINIMUM_TIME then
  152.     MINIMUM_TIME := SYSTEM.TICK * 100 ;
  153.   end if;
  154.  
  155.   if DURATION'SMALL * 100 > MINIMUM_TIME then
  156.     MINIMUM_TIME := DURATION'SMALL * 100 ;
  157.   end if;
  158.  
  159. -- MINIMUM_TIME is now the larger of 1.0 second,     (10.0 fast machines)
  160. --                                   100*SYSTEM.TICK,
  161. --                                   100*DURATION'SMALL
  162.  
  163.   CONTROL_DURATION := 0.0 ;
  164.   WALL_CONTROL_DURATION := 0.0 ;
  165.  
  166. end ITERATION ;
  167.