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

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