svn commit: r1685 - logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch

Author: ceki Date: Sun May 4 20:20:11 2008 New Revision: 1685 Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/DurationUnit.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/Profiler.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/StopWatch.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/Util.java Log: renaming folder Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/DurationUnit.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/DurationUnit.java Sun May 4 20:20:11 2008 @@ -0,0 +1,5 @@ +package ch.qos.logback.classic.stopwatch; + +public enum DurationUnit { + NANOSECOND, MICROSECOND, MILLISSECOND, SECOND; +} \ No newline at end of file Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/Profiler.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/Profiler.java Sun May 4 20:20:11 2008 @@ -0,0 +1,137 @@ +package ch.qos.logback.classic.stopwatch; + +import java.util.ArrayList; +import java.util.List; + +import ch.qos.logback.core.Layout; +import ch.qos.logback.core.pattern.SpacePadder; + +// + Profiler [BAS] +// |-- elapsed time [doX] 0 milliseconds. +// |-- elapsed time [doYYYYY] 56 milliseconds. +// |--+ Profiler Y +// |-- elapsed time [doZ] 21 milliseconds. +// |-- elapsed time [doZ] 21 milliseconds. +// |-- Total elapsed time [Y] 78 milliseconds. +// |-- elapsed time [doZ] 21 milliseconds. +// |-- Total elapsed time [BAS] 78 milliseconds. + +public class Profiler { + + final static int MIN_SW_NAME_LENGTH = 10; + final static int MIN_SW_ELAPSED_TIME_NUMBER_LENGTH = 6; + + final String name; + final StopWatch globalStopWatch; + + List<StopWatch> stopwatchList = new ArrayList<StopWatch>(); + List<Object> childList = new ArrayList<Object>(); + + public Profiler(String name) { + this.name = name; + this.globalStopWatch = new StopWatch(name); + } + + public void start(String name) { + stopLastStopWatch(); + StopWatch childSW = new StopWatch(name); + stopwatchList.add(childSW); + childList.add(childSW); + } + + public Profiler startNested(String name) { + Profiler nestedProfiler = new Profiler(name); + childList.add(nestedProfiler); + return nestedProfiler; + } + + StopWatch getLastStopWatch() { + if (stopwatchList.size() > 0) { + return stopwatchList.get(stopwatchList.size() - 1); + } else { + return null; + } + } + + void stopLastStopWatch() { + StopWatch last = getLastStopWatch(); + if (last != null) { + last.stop(); + } + } + + void stopNestedProfilers() { + for (Object child : childList) { + if (child instanceof Profiler) + ((Profiler) child).stop(); + } + } + + public Profiler stop() { + stopLastStopWatch(); + stopNestedProfilers(); + globalStopWatch.stop(); + return this; + } + + public void print() { + DurationUnit du = Util.selectDurationUnitForDisplay(globalStopWatch); + String r = buildString(du, "+", ""); + System.out.println(r); + } + + private String buildString(DurationUnit du, String prefix, String indentation) { + StringBuffer buf = new StringBuffer(); + + + buf.append(prefix); + buf.append(" Profiler ["); + buf.append(name); + buf.append("]"); + buf.append(Layout.LINE_SEP); + for (Object child : childList) { + if(child instanceof StopWatch) { + buildStringForChildStopWatch(buf, indentation, (StopWatch) child, du); + } else if(child instanceof Profiler) { + Profiler profiler = (Profiler) child; + profiler.stop(); + String subString = profiler.buildString(du, "|--+", indentation + " "); + buf.append(subString); + } + } + buildStringForGlobalStopWatch(buf, indentation, globalStopWatch, du); + return buf.toString(); + } + + private static void buildStringForChildStopWatch(StringBuffer buf, + String indentation, StopWatch sw, DurationUnit du) { + + buf.append(indentation); + buf.append("|--"); + buf.append(" elapsed time "); + SpacePadder.leftPad(buf, "[" + sw.getName() + "]", MIN_SW_NAME_LENGTH); + buf.append(" "); + String timeStr = Util.durationInDunrationUnitsAsStr(sw.getResultInNanos(), + du); + SpacePadder.leftPad(buf, timeStr, MIN_SW_ELAPSED_TIME_NUMBER_LENGTH); + buf.append(" "); + Util.appendDurationUnitAsStr(buf, du); + buf.append(Layout.LINE_SEP); + } + + private static void buildStringForGlobalStopWatch(StringBuffer buf, + String indentation, StopWatch sw, DurationUnit du) { + buf.append(indentation); + buf.append("|--"); + buf.append(" Total elapsed time "); + SpacePadder.leftPad(buf, "[" + sw.getName() + "]", MIN_SW_NAME_LENGTH); + buf.append(" "); + String timeStr = Util.durationInDunrationUnitsAsStr(sw.getResultInNanos(), + du); + SpacePadder.leftPad(buf, timeStr, MIN_SW_ELAPSED_TIME_NUMBER_LENGTH); + buf.append(" "); + Util.appendDurationUnitAsStr(buf, du); + buf.append(Layout.LINE_SEP); + } + +} Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/StopWatch.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/StopWatch.java Sun May 4 20:20:11 2008 @@ -0,0 +1,68 @@ +package ch.qos.logback.classic.stopwatch; + + +public class StopWatch { + + + enum Status { + STARTED, STOPPED; + } + + final String name; + final long startTime; + long stopTime; + Status status; + + public StopWatch(String name) { + this.name = name; + this.startTime = System.nanoTime(); + this.status = Status.STARTED; + } + + public String getName() { + return name; + } + + public StopWatch stop() { + if(status == Status.STOPPED) { + return this; + } + return stop(System.nanoTime()); + } + + public StopWatch stop(long stopTime) { + this.status = Status.STOPPED; + this.stopTime = stopTime; + return this; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append("StopWatch ["); + buf.append(name); + buf.append("] "); + + switch (status) { + case STARTED: + buf.append("STARTED"); + break; + case STOPPED: + buf.append("elapsed time: "); + buf.append(Util.durationInDunrationUnitsAsStr(getResultInNanos(), DurationUnit.MICROSECOND)); + break; + default: + new IllegalStateException("Status " + status + " is not expected"); + } + return buf.toString(); + } + + public final long getResultInNanos() { + if (status == Status.STARTED) { + return 0; + } else { + return stopTime - startTime; + } + } + +} Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/Util.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/stopwatch/Util.java Sun May 4 20:20:11 2008 @@ -0,0 +1,83 @@ +package ch.qos.logback.classic.stopwatch; + +import java.text.DecimalFormat; + +class Util { + + static final long NANOS_IN_ONE_MICROSECOND = 1000; + static final long NANOS_IN_ONE_MILLISECOND = NANOS_IN_ONE_MICROSECOND * 1000; + static final long NANOS_IN_ONE_SECOND =NANOS_IN_ONE_MILLISECOND * 1000; + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.000"); + + static DurationUnit selectDurationUnitForDisplay(StopWatch sw) { + return selectDurationUnitForDisplay(sw.getResultInNanos()); + } + + static DurationUnit selectDurationUnitForDisplay(long durationInNanos) { + if (durationInNanos < 10*NANOS_IN_ONE_MICROSECOND) { + return DurationUnit.NANOSECOND; + } else if (durationInNanos < 10*NANOS_IN_ONE_MILLISECOND) { + return DurationUnit.MICROSECOND; + } else if (durationInNanos < 10*NANOS_IN_ONE_SECOND) { + return DurationUnit.MILLISSECOND; + } else { + return DurationUnit.SECOND; + } + } + + static public double convertToMicros(long nanos) { + return (double) nanos / NANOS_IN_ONE_MICROSECOND; + } + + static public double convertToMillis(long nanos) { + return (double) nanos / NANOS_IN_ONE_MILLISECOND; + } + + static public double convertToSeconds(long nanos) { + return ((double) nanos / NANOS_IN_ONE_SECOND); + } + + static String durationInDunrationUnitsAsStr(StringBuffer buf, StopWatch sw) { + DurationUnit du = selectDurationUnitForDisplay(sw); + return durationInDunrationUnitsAsStr(sw.getResultInNanos(), du); + } + + static String durationInDunrationUnitsAsStr(long nanos, DurationUnit durationUnit) { + StringBuffer buf = new StringBuffer(); + switch (durationUnit) { + case NANOSECOND: + buf.append(nanos); + break; + case MICROSECOND: + double micros = convertToMicros(nanos); + buf.append(DECIMAL_FORMAT.format(micros)); + break; + case MILLISSECOND: + double millis = convertToMillis(nanos); + buf.append(DECIMAL_FORMAT.format(millis)); + break; + case SECOND: + double seconds = convertToSeconds(nanos); + buf.append(DECIMAL_FORMAT.format(seconds)); + break; + } + return buf.toString(); + } + + static void appendDurationUnitAsStr(StringBuffer buf, DurationUnit durationUnit) { + switch (durationUnit) { + case NANOSECOND: + buf.append("nanoseconds."); + break; + case MICROSECOND: + buf.append("microseconds."); + break; + case MILLISSECOND: + buf.append("milliseconds."); + break; + case SECOND: + buf.append(" seconds."); + break; + } + } +}
participants (1)
-
noreply.ceki@qos.ch