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 }