Java tutorial
/* * Copyright 2000,2005 wingS development team. * * This file is part of wingS (http://wingsframework.org). * * wingS is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * Please see COPYING for the complete licence. */ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Iterator; /* * Ein Klasse, die Zeitmessungen aufnimmt und diese in Relation zueineander * setzt. Zum Start der Zeitmessung Methode start kurzer Beschreibung was * gemessen wird als Parameter aufrufen. Das Ende der Zeitmessung wird durch * stop angezeigt. Es kann nur eine Zeitmessung gleichzeitig stattfinden. Die * Ausgabe ist nicht sortiert, gibt aber die relativen Unterschiede in der * Dauer der einzelnen Messungen an. Die Messung mit der laengsten Dauer ist * der Referenzwert (1.0). */ /** * Some simple stop watch. It allows to measure multiple time periods * and prints them. Usage: call start(comment) and stop() for * each period of time. * * @author <a href="mailto:haaf@mercatis.de">Armin Haaf</a> */ public class TimeMeasure { protected final static double RESOLUTION = 100.0; /** * List of measurements. */ protected final ArrayList measures; /** * Message formatter */ protected final MessageFormat formatter; /** * the current time measurement. */ protected Measure current; /** * Simple TimeMesaure with default format. */ public TimeMeasure() { this(new MessageFormat("{0}\t: {1}\t {2}x\n")); } /** * A new TimeMeasure which reports in a specific format. The * format is a standard MessageFormat with the following variables: * <ul> * <li><code>{0}</code> the measurement comment</li> * <li><code>{1}</code> the time it took</li> * <li><code>{2}</code> how many times this is faster than the * slowest measurement</li> * </ul> */ public TimeMeasure(MessageFormat formatter) { this.measures = new ArrayList(); this.formatter = formatter; } /** * Reset of all Measurements. */ public void reset() { measures.clear(); } /* * Startet eine neue Messsung. * @param comment Die Beschreibung der Messung. */ public void start(String comment) { current = new Measure(comment); } /* * Startet eine neue Messsung. * @param comment Die Beschreibung der Messung. public Object generate(String comment) { current = new Measure(); actual.comment = comment; measures.add(actual); return actual; } */ /* * Addiert eine Messsung zu einer bestehenden. * @param comment Die Beschreibung der Messung. public void addToMeasure(Object measure) { int index = measures.indexOf(measure); if ( index<0 ) { System.err.println("Measure does not exists " + measure); actual = null; return; } actual = (Measure)measures.get(index); measures.remove(index); actual.start = System.currentTimeMillis(); } */ /** * stop current time measurement and store it. */ public void stop() { if (current != null) { current.stop(); measures.add(current); current = null; } } /** * determines the time duration of the longest or shortest time interval. * * @param findShortest boolean 'true', if we are looking for the shortest * time interval; 'false' if we are looking for the * longest. */ private long findReferenceValue(boolean findShortest) { long result = findShortest ? Long.MAX_VALUE : -1; Iterator it = measures.iterator(); while (it.hasNext()) { Measure m = (Measure) it.next(); result = (findShortest ? Math.min(result, m.getDuration()) : Math.max(result, m.getDuration())); } return result; } public String print() { return print(false); } /** * creates a formatted output (using the MessageFormat) of all * results. The output is sorted in the in the sequence the time * measurements took place. * Writes the relative time to either the shortest or the longest * time interval. * * @param shortestIsReference boolean true, if the shortest time interval * is the reference value (1.0). False, if the * longest is the reference. */ public String print(boolean shortestIsReference) { StringBuilder result = new StringBuilder(); long reference = findReferenceValue(shortestIsReference); Iterator it = measures.iterator(); while (it.hasNext()) { Measure m = (Measure) it.next(); String factor = " -- "; long duration = m.getDuration(); if (reference > 0) { long tmp = (long) ((duration * RESOLUTION) / reference); factor = String.valueOf(tmp / RESOLUTION); } Object[] args = { m.getComment(), (duration + "ms"), factor }; result.append(formatter.format(args)); } return result.toString(); } public String toString() { return print(); } /** * A class to store one period of time. */ private final static class Measure { /** * start time. */ private final long start; /** * stop time. */ private long stop; /** * Die Gesamtdauer der Messung */ private long duration; /** * Description. */ private String comment; public Measure(String comment) { start = System.currentTimeMillis(); this.comment = comment; } public void stop() { stop = System.currentTimeMillis(); duration = stop - start; } public long getDuration() { return duration; } public String getComment() { return comment; } } }