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

  1. -- A000055
  2. --
  3. -- This is an executable procedure that can be called outside
  4. -- whatever is being measured.
  5. -- This version works in conjunction with A000052,A000054,A000055
  6. -- to measure CPU time and WALL time without modifying the tests
  7. -- There will be a file named A000052D created and used by these
  8. -- procedures.
  9. --
  10. -- USAGE :
  11. --             A000052
  12. --               optional control
  13. --             A000053
  14. --             A000054
  15. --               test being measured
  16. --             A000055
  17. --
  18. -- RESULT :
  19. --             ( (55) - (54) ) - ( (53) - (52) ) is the measurement
  20. --
  21. --             The second expression takes out the time to make the
  22. --             measurement. As a check, (3) - (2) should be close to (2) - (1)
  23. --
  24. --             The printout gives the CPU and WALL time in seconds for
  25. --             the run being measured.
  26. --
  27.  
  28. with CPU_TIME_CLOCK ;  -- various choices on tape
  29. with CALENDAR ; -- used for WALL clock times
  30. with TEXT_IO ;  -- for printing times
  31. with DURATION_IO ; -- for printing times
  32.  
  33. procedure A000055 is
  34.   MY_FILE : TEXT_IO.FILE_TYPE ;
  35.   HOLD_1 : STRING ( 1 .. 80 ) ;
  36.   HOLD_2 : STRING ( 1 .. 80 ) ;
  37.   HOLD_3 : STRING ( 1 .. 80 ) ;
  38.   LENGTH : NATURAL ;
  39.   START : POSITIVE ;
  40.   END_POS : POSITIVE ;
  41.   CPU_SECONDS_NOW : DURATION := CPU_TIME_CLOCK ;
  42.   WALL_SECONDS_NOW : DURATION := CALENDAR.SECONDS(CALENDAR.CLOCK) ;
  43.   CPU_SECONDS_OVERHEAD : DURATION ;
  44.   WALL_SECONDS_OVERHEAD : DURATION ;
  45.   CPU_SECONDS_OVERHEAD_2 : DURATION ;
  46.   WALL_SECONDS_OVERHEAD_2 : DURATION ;
  47.   CPU_SECONDS_OF_TEST : DURATION ;
  48.   WALL_SECONDS_OF_TEST : DURATION ;
  49. --
  50. --  Function to find the mark "=" in the record befor the value
  51. --
  52.   function MARK ( ITEM : STRING ) return positive is
  53.   begin
  54.     for I in ITEM'RANGE loop
  55.       if ITEM ( I ) = '=' then
  56.         return I + 1 ;
  57.       end if ;
  58.     end loop ; -- error if loop terminates
  59.     raise PROGRAM_ERROR ;
  60.   end MARK ;
  61.  
  62. begin
  63.  
  64. --
  65. --   Write out full results for possible future analysis
  66. --
  67.   TEXT_IO.OPEN ( MY_FILE , TEXT_IO.IN_FILE , "A000052D" ) ;
  68.   TEXT_IO.GET_LINE ( MY_FILE , HOLD_1 , LENGTH ) ;
  69.   TEXT_IO.GET_LINE ( MY_FILE , HOLD_2 , LENGTH ) ;
  70.   TEXT_IO.GET_LINE ( MY_FILE , HOLD_3 , LENGTH ) ;
  71.   TEXT_IO.CLOSE ( MY_FILE ) ;
  72.   TEXT_IO.OPEN ( MY_FILE , TEXT_IO.OUT_FILE , "A000052D" ) ;
  73.   TEXT_IO.PUT_LINE ( MY_FILE , HOLD_1 ( 1 .. LENGTH ) ) ;
  74.   TEXT_IO.PUT_LINE ( MY_FILE , HOLD_2 ( 1 .. LENGTH ) ) ;
  75.   TEXT_IO.PUT_LINE ( MY_FILE , HOLD_3 ( 1 .. LENGTH ) ) ;
  76.   TEXT_IO.PUT ( MY_FILE , " '55 CPU time =" ) ;
  77.   DURATION_IO.PUT ( MY_FILE , CPU_SECONDS_NOW ) ;
  78.   TEXT_IO.PUT ( MY_FILE , "        WALL time =" ) ;
  79.   DURATION_IO.PUT ( MY_FILE , WALL_SECONDS_NOW ) ;
  80.   TEXT_IO.PUT_LINE ( MY_FILE , " seconds." ) ;
  81.   TEXT_IO.CLOSE ( MY_FILE ) ;
  82. --
  83. --  Compute and print results
  84. --
  85.   START := MARK ( HOLD_1 ) ;
  86.   DURATION_IO.GET ( HOLD_1(START..LENGTH), CPU_SECONDS_OVERHEAD, END_POS ) ;
  87.   START := MARK ( HOLD_1(START..LENGTH) ) ;
  88.   DURATION_IO.GET ( HOLD_1(START..LENGTH), WALL_SECONDS_OVERHEAD, END_POS ) ;
  89.   START := MARK ( HOLD_2 ) ;
  90.   DURATION_IO.GET ( HOLD_2(START..LENGTH), CPU_SECONDS_OVERHEAD_2, END_POS ) ;
  91.   START := MARK ( HOLD_2(START..LENGTH) ) ;
  92.   DURATION_IO.GET ( HOLD_2(START..LENGTH), WALL_SECONDS_OVERHEAD_2, END_POS ) ;
  93.   START := MARK ( HOLD_3 ) ;
  94.   DURATION_IO.GET ( HOLD_3(START..LENGTH), CPU_SECONDS_OF_TEST, END_POS ) ;
  95.   START := MARK ( HOLD_3(START..LENGTH) ) ;
  96.   DURATION_IO.GET ( HOLD_3(START..LENGTH), WALL_SECONDS_OF_TEST, END_POS ) ;
  97.   CPU_SECONDS_OF_TEST := ( CPU_SECONDS_NOW - CPU_SECONDS_OF_TEST ) - 
  98.                          ( CPU_SECONDS_OVERHEAD_2 - CPU_SECONDS_OVERHEAD ) ;
  99.   WALL_SECONDS_OF_TEST := ( WALL_SECONDS_NOW - WALL_SECONDS_OF_TEST ) - 
  100.                           ( WALL_SECONDS_OVERHEAD_2 - WALL_SECONDS_OVERHEAD ) ;
  101.   TEXT_IO.PUT_LINE ( "Measurement" ) ;
  102.   TEXT_IO.PUT ( "CPU Time:   " ) ;
  103.   DURATION_IO.PUT ( CPU_SECONDS_OF_TEST , 6 , 2 ) ;
  104.   TEXT_IO.PUT_LINE ( "  seconds" ) ;
  105.   TEXT_IO.PUT ( "Wall Time:  " ) ;
  106.   DURATION_IO.PUT ( WALL_SECONDS_OF_TEST , 6 , 2 ) ;
  107.   TEXT_IO.PUT_LINE ( "  seconds" ) ;
  108. end A000055 ;
  109.