public void testOutputFormat() { ByteArrayOutputStream output = new ByteArrayOutputStream(); PrintStream outstream = new PrintStream(output); PerformanceTracker tracker = new PerformanceTracker(emptyScript, TracerMode.ALL, outstream); tracker.outputTracerReport(); outstream.close(); Pattern p = Pattern.compile( ".*Summary:\npass,runtime,allocMem,runs,changingRuns,reduction,gzReduction" + ".*TOTAL:" + "\nRuntime\\(ms\\): [0-9]+" + "\nMax mem usage \\(measured after each pass\\)\\(MB\\): -?[0-9]+" + "\n#Runs: [0-9]+" + "\n#Changing runs: [0-9]+" + "\n#Loopable runs: [0-9]+" + "\n#Changing loopable runs: [0-9]+" + "\nEstimated Reduction\\(bytes\\): [0-9]+" + "\nEstimated GzReduction\\(bytes\\): [0-9]+" + "\nEstimated Size\\(bytes\\): -?[0-9]+" + "\nEstimated GzSize\\(bytes\\): -?[0-9]+" + "\n\nLog:\n" + "pass,runtime,allocMem,codeChanged,reduction,gzReduction,size,gzSize.*", Pattern.DOTALL); String outputString = output.toString(); assertThat(outputString).matches(p); }
public void testStatsCalculation() { PerformanceTracker tracker = new PerformanceTracker(emptyScript, TracerMode.ALL, null); CodeChangeHandler handler = tracker.getCodeChangeHandler(); // It's sufficient for this test to assume that a single run of any pass // takes some fixed amount of time, say 5ms. int passRuntime = 5; tracker.recordPassStart("noloopA", true); handler.reportChange(); tracker.recordPassStop("noloopA", passRuntime); tracker.recordPassStart("noloopB", true); handler.reportChange(); tracker.recordPassStop("noloopB", passRuntime); tracker.recordPassStart("loopA", false); handler.reportChange(); tracker.recordPassStop("loopA", passRuntime); tracker.recordPassStart("loopA", false); tracker.recordPassStop("loopA", passRuntime); tracker.recordPassStart("noloopB", true); handler.reportChange(); tracker.recordPassStop("noloopB", passRuntime); tracker.recordPassStart("loopB", false); tracker.recordPassStop("loopB", passRuntime); tracker.recordPassStart("noloopB", true); tracker.recordPassStop("noloopB", passRuntime); int numRuns = tracker.getRuns(); assertEquals(numRuns, 7); assertEquals(tracker.getRuntime(), numRuns * passRuntime); assertEquals(tracker.getLoopRuns(), 3); assertEquals(tracker.getChanges(), 4); /* reportChange was called 4 times */ assertEquals(tracker.getLoopChanges(), 1); ImmutableMap<String, Stats> stats = tracker.getStats(); Stats st = stats.get("noloopA"); assertEquals(st.runs, 1); assertEquals(st.runtime, passRuntime); assertEquals(st.changes, 1); st = stats.get("noloopB"); assertEquals(st.runs, 3); assertEquals(st.runtime, 3 * passRuntime); assertEquals(st.changes, 2); st = stats.get("loopA"); assertEquals(st.runs, 2); assertEquals(st.runtime, 2 * passRuntime); assertEquals(st.changes, 1); st = stats.get("loopB"); assertEquals(st.runs, 1); assertEquals(st.runtime, passRuntime); assertEquals(st.changes, 0); }