1 cananian 1.1.2.6 // Stats.java, created Sat Jan 20 23:39:00 2001 by wbeebee
  2 wbeebee  1.1.2.3 // Copyright (C) 2001 Wes Beebee <wbeebee@mit.edu>
  3 wbeebee  1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 wbeebee  1.1.2.1 package harpoon.Analysis.Realtime;
  5 wbeebee  1.1.2.1 
  6 wbeebee  1.1.2.3 import harpoon.Analysis.Quads.QuadCounter;
  7 wbeebee  1.1.2.3 
  8 wbeebee  1.1.2.3 import harpoon.ClassFile.CachingCodeFactory;
  9 wbeebee  1.1.2.3 import harpoon.ClassFile.HCodeFactory;
 10 wbeebee  1.1.2.3 
 11 wbeebee  1.1.2.3 import harpoon.Util.Timer;
 12 wbeebee  1.1.2.1 import harpoon.Util.Util;
 13 wbeebee  1.1.2.1 
 14 wbeebee  1.1.2.3 /**
 15 wbeebee  1.1.2.3  * <code>Stats</code> calculates statistics for the static analysis 
 16 wbeebee  1.1.2.3  * and compilation of RTJ extensions.
 17 wbeebee  1.1.2.3  *
 18 cananian 1.1.2.6  * @author Wes Beebee <wbeebee@mit.edu>
 19 cananian 1.4      * @version $Id: Stats.java,v 1.4 2002/04/10 03:01:16 cananian Exp $
 20 wbeebee  1.1.2.3  */
 21 wbeebee  1.1.2.3 
 22 wbeebee  1.1.2.1 class Stats {
 23 wbeebee  1.1.2.3     private static long actualChecks = 0;
 24 wbeebee  1.1.2.3     private static long removedChecks = 0;
 25 wbeebee  1.1.2.3     private static long memAreaLoads = 0;
 26 wbeebee  1.1.2.3     private static long newObjects = 0;
 27 wbeebee  1.1.2.3     private static long newArrayObjects = 0;
 28 wbeebee  1.1.2.5     private static long newInstanceChecks = 0;
 29 wbeebee  1.1.2.3 
 30 wbeebee  1.1.2.3     private static Timer realtimeTimer = new Timer();
 31 wbeebee  1.1.2.3     private static Timer analysisTimer = new Timer();
 32 wbeebee  1.1.2.3 
 33 wbeebee  1.1.2.3     private static QuadCounter quadsIn = null;
 34 wbeebee  1.1.2.3     private static QuadCounter quadsOut = null;
 35 wbeebee  1.1.2.3 
 36 wbeebee  1.1.2.3     /** Tallies an actual check placed around an [A]SET. */
 37 wbeebee  1.1.2.3       
 38 wbeebee  1.1.2.3     static void addActualMemCheck() {
 39 wbeebee  1.1.2.3         actualChecks++;
 40 wbeebee  1.1.2.3     }
 41 wbeebee  1.1.2.3     
 42 wbeebee  1.1.2.3     /** Tallies a check that was removed from around an [A]SET. */
 43 wbeebee  1.1.2.3 
 44 wbeebee  1.1.2.3     static void addRemovedMemCheck() {
 45 wbeebee  1.1.2.3         removedChecks++;
 46 wbeebee  1.1.2.3     }
 47 wbeebee  1.1.2.3     
 48 wbeebee  1.1.2.3     /** Tallies a load of the current MemoryArea. */
 49 wbeebee  1.1.2.3 
 50 wbeebee  1.1.2.3     static void addMemAreaLoad() {
 51 wbeebee  1.1.2.3         memAreaLoads++;
 52 wbeebee  1.1.2.3     }
 53 wbeebee  1.1.2.3 
 54 wbeebee  1.1.2.3     /** Tracks the number of <code>Quad</code>s passing through this 
 55 wbeebee  1.1.2.3      *  <code>HCodeFactory</code>. 
 56 wbeebee  1.1.2.3      */
 57 wbeebee  1.1.2.3 
 58 wbeebee  1.1.2.3     static HCodeFactory trackQuadsIn(HCodeFactory parent) {
 59 wbeebee  1.1.2.3         return new CachingCodeFactory(quadsIn = new QuadCounter(parent));
 60 wbeebee  1.1.2.3     }
 61 wbeebee  1.1.2.3 
 62 wbeebee  1.1.2.3     /** Tracks the number of <code>Quad</code>s passing through this 
 63 wbeebee  1.1.2.3      *  <code>HCodeFactory</code>. 
 64 wbeebee  1.1.2.3      */
 65 wbeebee  1.1.2.3 
 66 wbeebee  1.1.2.3     static HCodeFactory trackQuadsOut(HCodeFactory parent) {
 67 wbeebee  1.1.2.3         return new CachingCodeFactory(quadsOut = new QuadCounter(parent));
 68 wbeebee  1.1.2.1     }
 69 wbeebee  1.1.2.1 
 70 wbeebee  1.1.2.3     /** Adds an object that was just <code>NEW</code>'d. */
 71 wbeebee  1.1.2.1 
 72 wbeebee  1.1.2.3     static void addNewObject() {
 73 wbeebee  1.1.2.3         newObjects++;
 74 wbeebee  1.1.2.3     }
 75 wbeebee  1.1.2.3 
 76 wbeebee  1.1.2.3     /** Adds an array that was just <code>NEW</code>'d. */
 77 wbeebee  1.1.2.3     
 78 wbeebee  1.1.2.3     static void addNewArrayObject() {
 79 wbeebee  1.1.2.3         newArrayObjects++;
 80 wbeebee  1.1.2.3     }
 81 wbeebee  1.1.2.3     
 82 wbeebee  1.1.2.5     /** Adds a Memory.newInstance() call */
 83 wbeebee  1.1.2.5 
 84 wbeebee  1.1.2.5     static void addNewInstance() {
 85 wbeebee  1.1.2.5         newInstanceChecks++;
 86 wbeebee  1.1.2.5     }
 87 wbeebee  1.1.2.5 
 88 wbeebee  1.1.2.3     /** Starts the timer for analysis. */
 89 wbeebee  1.1.2.3 
 90 wbeebee  1.1.2.3     static void analysisBegin() {
 91 wbeebee  1.1.2.3         analysisTimer.start();
 92 wbeebee  1.1.2.3     }
 93 wbeebee  1.1.2.3     
 94 wbeebee  1.1.2.3     /** Stops the timer for analysis. */
 95 wbeebee  1.1.2.3 
 96 wbeebee  1.1.2.3     static void analysisEnd() {
 97 wbeebee  1.1.2.3         analysisTimer.stop();
 98 wbeebee  1.1.2.3     }
 99 wbeebee  1.1.2.3     
100 wbeebee  1.1.2.3     /** Starts the timer for adding RTJ extensions. */
101 wbeebee  1.1.2.3 
102 wbeebee  1.1.2.3     static void realtimeBegin() {
103 wbeebee  1.1.2.3         realtimeTimer.start();
104 wbeebee  1.1.2.3     }
105 wbeebee  1.1.2.3 
106 wbeebee  1.1.2.3     /** Stops the timer for adding RTJ extensions. */
107 wbeebee  1.1.2.3     
108 wbeebee  1.1.2.3     static void realtimeEnd() {
109 wbeebee  1.1.2.3         realtimeTimer.stop();
110 wbeebee  1.1.2.3     }
111 wbeebee  1.1.2.3     
112 wbeebee  1.1.2.3     /** Prints out statistics for addition of RTJ extensions. */
113 wbeebee  1.1.2.3 
114 wbeebee  1.1.2.3     static void print() {
115 cananian 1.3.2.1         assert !analysisTimer.running() : "AnalysisTimer is still running!";
116 cananian 1.3.2.1         assert !realtimeTimer.running() : "RealtimeTimer is still running!";
117 wbeebee  1.1.2.3         System.out.println("-----------------------------------" +
118 wbeebee  1.1.2.3                            "------------------");
119 wbeebee  1.1.2.3         System.out.println("Realtime Java static analysis statistics:");
120 wbeebee  1.1.2.3         System.out.println("                          " +
121 wbeebee  1.1.2.3                            "Before    After   % Savings");
122 wbeebee  1.1.2.3         System.out.print("  Memory access checks: " +
123 wbeebee  1.1.2.3                          (actualChecks + removedChecks) + "   "
124 wbeebee  1.1.2.5                          + actualChecks + "   ");
125 wbeebee  1.1.2.3         if (actualChecks+removedChecks > 0) {
126 wbeebee  1.1.2.3             System.out.print((removedChecks/
127 wbeebee  1.1.2.3                               (actualChecks+removedChecks)) * 100.0);
128 wbeebee  1.1.2.3         }
129 wbeebee  1.1.2.3         System.out.println();
130 wbeebee  1.1.2.5         System.out.println("  new instance checks: " + newInstanceChecks);
131 wbeebee  1.1.2.3         System.out.println("  memArea loads: " + memAreaLoads);
132 wbeebee  1.1.2.3         System.out.println("  new objects: " + newObjects);
133 wbeebee  1.1.2.3         System.out.println("  new array objects: " + newArrayObjects);
134 wbeebee  1.1.2.3         System.out.println();
135 wbeebee  1.1.2.3         System.out.println("Total time spent adding Realtime support: "+
136 wbeebee  1.1.2.3                            (realtimeTimer.timeElapsed() / 1000.0) + " s");
137 wbeebee  1.1.2.3         System.out.println("  Time spent in analysis to remove checks: "+
138 wbeebee  1.1.2.3                            (analysisTimer.timeElapsed() / 1000.0) + " s");
139 wbeebee  1.1.2.3         System.out.println();
140 wbeebee  1.1.2.3         if ((quadsIn != null) || (quadsOut != null)) {
141 wbeebee  1.1.2.4             System.out.print("Number of quads");
142 wbeebee  1.1.2.3         }
143 wbeebee  1.1.2.3         if (quadsIn != null) {
144 wbeebee  1.1.2.3             System.out.print(" in: " + quadsIn.count());
145 wbeebee  1.1.2.3         }
146 wbeebee  1.1.2.3         if (quadsOut != null) {
147 wbeebee  1.1.2.4             System.out.print(" out: " + quadsOut.count());
148 wbeebee  1.1.2.3         }
149 wbeebee  1.1.2.3         if ((quadsIn != null) && (quadsOut != null)) {
150 wbeebee  1.1.2.3             System.out.print(" out-in: " + (quadsOut.count() - 
151 wbeebee  1.1.2.3                                             quadsIn.count()));
152 wbeebee  1.1.2.3             if (quadsIn.count() > 0) {
153 wbeebee  1.1.2.3                 System.out.print(" %bloat: " + ((((quadsOut.count() -
154 wbeebee  1.1.2.3                                                    quadsIn.count()) * 1.0) /
155 wbeebee  1.1.2.3                                                (quadsIn.count() * 1.0))
156 wbeebee  1.1.2.3                                                 * 100.0));
157 wbeebee  1.1.2.3             }
158 wbeebee  1.1.2.3         }
159 wbeebee  1.1.2.3         if ((quadsIn != null) || (quadsOut != null)) {
160 wbeebee  1.1.2.3             System.out.println();
161 wbeebee  1.1.2.3         }
162 wbeebee  1.1.2.3         System.out.println("-----------------------------------"+
163 wbeebee  1.1.2.3                            "------------------");
164 wbeebee  1.1.2.3     }
165 cananian 1.2     }