home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol071 / profile.pas < prev    next >
Pascal/Delphi Source File  |  1984-04-29  |  4KB  |  151 lines

  1. program profile;
  2. {$E-,C-,T-
  3.   Read the file A:PROFILER.DAT created by a run of
  4.   a program with execution-profiling set on.  Format
  5.   the data and write A:PROFILER.PRN, a histogram.
  6.  
  7.   The input file consists of a number of 16-bit integers
  8.   in Pascal/Z format, i.e. BACKWARDS to the usual Intel,
  9.   CP/M, etc way of storing an integer, with the most
  10.   significant byte first.
  11.  
  12.   The first integer is the count of statements profiled.
  13.   It may be zero -- if the T+ option was not on -- or it
  14.   may be greater than "maxstmt," especially if the file
  15.   is garbage.
  16.  
  17.   The second integer is the statement number of the first
  18.   statement profiled (traced), and the third is the number
  19.   of the last statement.
  20.  
  21.   Then follows the array of statement-count integers.
  22. }
  23. const
  24.     maxstmt = 4000; { max number of statements allowed }
  25.  
  26. type
  27.     inum = record   { binary integer in file }
  28.         val : integer
  29.     end;
  30.     s_range = 1..maxstmt;
  31.  
  32. var
  33.     inf : file of inum;
  34.     ouf : text;
  35.     inname,
  36.     otname  : array[1..14] of char;
  37.     data    : array[s_range] of real;
  38.     idata   : array[s_range] of integer;
  39.     lostmt,
  40.     histmt,
  41.     nstmt   : s_range;
  42.     sumexec : real;
  43.     n : integer;
  44. {
  45.     read the next integer from the file
  46. }
  47. function iread : integer;
  48.     var i : inum;
  49.     begin
  50.     if not eof(inf) then begin
  51.         read(inf,i);
  52.         iread := i.val
  53.         end
  54.     else begin
  55.         writeln('I boobed and read past EOF');
  56.         iread := 0
  57.         end
  58.     end;
  59. {
  60.     read an integer -- which might be over 32767 and
  61.     hence "negative" -- and convert to real.
  62. }
  63. function fread : real;
  64.     var r : real;
  65.     begin
  66.     r := iread; {implicit conversion to float}
  67.     if r<0 then r := r+65536.0;
  68.     fread := r
  69.     end;
  70. {
  71.     read all the statement counts and convert to float.
  72.     sum all statement counts for scaling purposes.
  73. }
  74. procedure readem;
  75.     var i : s_range; r : real;
  76.     begin
  77.     sumexec := 0.0;
  78.     for i := 1 to nstmt do begin
  79.         r := fread;
  80.         sumexec := sumexec+r;
  81.         data[i] := r
  82.         end
  83.     end;
  84. {
  85.     Scale the data so that each point is on a scale of
  86.     0..50, a two-percent fraction of the total count of
  87.     all statements executed.
  88. }
  89. procedure scalem;
  90.     var i : s_range; r : real;
  91.     begin
  92.     for i := 1 to nstmt do begin
  93.         r := 100.0 * ( data[i]/sumexec );
  94.         idata[i] := round(r) div 2
  95.         end
  96.     end;
  97. {
  98.     Print the scaled data, one line per profiled
  99.     statement, formatted so:
  100.  
  101. SSSS  NNNNN|*********                          |
  102.  
  103.     where SSSS is the statement number, NNNNN is the raw count,
  104.     and there are from 0 to 50 stars, as per the scaled data.
  105. }
  106. procedure printem;
  107.     var i,s : s_range;
  108.     aster : integer;
  109.     j : 1..50; stars : array[1..50] of char;
  110.     begin
  111.     rewrite(otname,ouf);
  112.     s := lostmt;
  113.     for i := 1 to nstmt do begin
  114.         write(ouf,s:4, data[i]:7:0,'|');
  115.         aster := idata[i];
  116.         for j := 1 to 50 do
  117.         if j<=aster then stars[j]:='*'
  118.         else         stars[j]:=' ';
  119.         write(ouf,stars);
  120.         writeln(ouf,'|');
  121.         s := s+1
  122.     end
  123.     end;
  124. {
  125.     main routine
  126. }
  127. begin
  128.     inname := 'A:PROFILER.DAT';
  129.     otname := 'A:PROFILER.PRN';
  130.     reset(inname,inf);
  131.     if not eof(inf) then begin { file exists }
  132.     n := iread;
  133.     if n<=maxstmt then begin { ..and is probably valid }
  134.         nstmt := n;
  135.         lostmt := iread;
  136.         histmt := iread;
  137.         if nstmt>0 then begin { ..and has data in it }
  138.         readem;
  139.         scalem;
  140.         printem
  141.         end
  142.         else
  143.         writeln('No statements traced in ',inname)
  144.         end
  145.     else
  146.         writeln('Too many statements traced -- ',n)
  147.     end
  148.     else
  149.     writeln(inname,' not found or empty')
  150. end.
  151.