home *** CD-ROM | disk | FTP | other *** search
/ The UNIX CD Bookshelf / OREILLY_TUCB_UNIX_CD.iso / upt / examples / SSOL2 / ARCHIVE / RUNTIME.Z / RUNTIME / sbin / runtime
Encoding:
Text File  |  1993-01-01  |  3.0 KB  |  90 lines

  1. #! /bin/csh -f
  2. #
  3. ###    runtime - run program repetitively and output time-usage statistics
  4. ###    Usage: runtime -n program_name [options_and_arguments] &
  5. ##
  6. ##  runtime RUNS A PROGRAM, OVER AND OVER AGAIN, COLLECTING
  7. ##  DATA ABOUT THE TIME IT TAKES TO RUN.  runtime OUTPUTS
  8. ##  A LIST OF THE INDIVIDUAL (C-SHELL) time RESULTS FOR EACH
  9. ##  PROGRAM EXECUTION, PLUS A TOTAL AND AVERAGE.
  10. ##
  11. ##  THE -n OPTION IS REQUIRED; IT'S THE NUMBER OF TIMES TO RUN THE
  12. ##  program_name.  FOR EXAMPLE,
  13. ##    % runtime -25 testprog
  14. ##  WILL RUN testprog 25 TIMES.
  15. ##
  16. ##  IF THE STRING TO EXECUTE HAS ANY SPECIAL CHARACTERS THAT THE SHELL
  17. ##  SHOULDN'T INTERPRET UNTIL EXECUTION, QUOTE THE STRING OR USE BACKSLASHES.
  18. ##  NOTE THAT THE QUOTED STRING CAN'T HAVE ANY REDIRECTION IN IT; THAT'S
  19. ##  BECAUSE runtime DOES SOME REDIRECTION OF ITS OWN.
  20.  
  21. set temp=/tmp/$$RUNTIME
  22. set stat=1    # EXIT STATUS ON ERROR (SET TO 0 BEFORE NORMAL EXIT)
  23. onintr cleanup
  24.  
  25. set count=`expr "$1" : '-\([0-9]*\)'`    # REMOVE LEADING DASH
  26.  
  27. # TEST FOR CORRECT SYNTAX OF $1 AND CORRECT NUMBER OF ARGUMENTS:
  28. if ( ("$count" !~ [0-9]*) || ($#argv < 2) ) then
  29.     echo "Usage: `basename $0` -number_of_times command_line_to_run"
  30.     exit 1
  31. endif
  32.  
  33. # BUILD TEST FILE (/tmp/$$RUNTIME1):
  34. echo set time >! ${temp}1
  35. repeat $count echo "$argv[2-] >& /dev/null" >> ${temp}1
  36.  
  37. # RUN TEST FILE AND STORE RESULTS IN /tmp/$$RUNTIME2:
  38. set starttime=`date`
  39. /bin/csh -f < ${temp}1 >& ${temp}2
  40. set endtime=`date`
  41.  
  42. # CHOP FIELDS FROM /tmp/$$RUNTIME2 AND PUT INTO /tmp/$$RUNTIME3;
  43. # sed DOES CHOPPING AND tr CHANGES COLON IN FIELD 3 TO A SPACE.
  44. # (TYPICAL LINE IN FILE 2: "0.5u 1.7s 0:04 53% 12+7k 13+17io 20pf+0w")
  45. # (TYPICAL LINE IN FILE 3: "0.5 1.7 0 04 12 7 13 17 20 0")
  46. sed -e 's/\(.*\..\)u \(.*\..\)s \(.*:.*\) .*% \(.*\)+\(.*\)k \(.*\)+\(.*\)io \(.*\)pf+\(.*\)w/\1 \2 \3 \4 \5 \6 \7 \8 \9/' \
  47. -e 's/:/ /g' ${temp}2 > ${temp}3
  48.  
  49. # PRINT HEADER AND INDIVIDUAL RESULTS:
  50. cat << ENDOFTHIS
  51. runtime summary -- $count runs of
  52.    % $argv[2-]
  53. (working directory = $cwd)
  54.  
  55. First run started at: $starttime
  56. Last run finished at: $endtime
  57. -----------------------------------------------
  58.  
  59.  RUN #      ***INDIVIDUAL RESULTS***
  60. `cat -n ${temp}2`
  61.  
  62. ENDOFTHIS
  63.  
  64. # PRINT AVERAGES (AND A BLANK LINE AFTER THEM):
  65. awk '{                                                                    \
  66.     field[1] += $1                                                        \
  67.     field[2] += $2                                                        \
  68.     # CONVERT SECONDS ($4) TO DECIMAL MINUTES, THEN ADD TO MINUTES ($3):\
  69.     field[3] += ($3 + $4/60)                                            \
  70.     # ADD $5 TO field[4], $6 TO field[5], etc...                        \
  71.     for (i = 5; i <= 10; i++)                                            \
  72.         field[i - 1] += $i                                                \
  73. }                                                                        \
  74. END {                                                                    \
  75.     print "AVERAGES:"                                                    \
  76.     printf "%5.2fu ", field[1]/NR                                        \
  77.     printf "%5.2fs ", field[2]/NR                                        \
  78.     temp = int(field[3]/NR)                                                \
  79.     printf "%d:%02d ", temp, (field[3]/NR - temp) * 60                    \
  80.     printf "%d+%dk ", field[4]/NR, field[5]/NR                            \
  81.     printf "%d+%dio ", field[6]/NR, field[7]/NR                            \
  82.     printf "%dpf+%dw ", field[8]/NR, field[9]/NR                        \
  83.     printf "\n\n"                                                        \
  84. }' ${temp}3
  85. set stat=0    # IF GET HERE, WE'RE ABOUT DONE; SET STATUS FOR NORMAL EXIT
  86.  
  87. cleanup:
  88. rm -f "$temp"{1,2,3}
  89. exit $stat
  90.