//----------------------------------------------------------------------------// // // // S t o p W a t c h // // // //----------------------------------------------------------------------------// // <editor-fold defaultstate="collapsed" desc="hdr"> // // Copyright © Hervé Bitteur and others 2000-2013. All rights reserved. // // This software is released under the GNU General Public License. // // Goto http://kenai.com/projects/audiveris to report bugs or suggestions. // //----------------------------------------------------------------------------// // </editor-fold> package omr.util; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; /** * Class {@code StopWatch} * * @author Hervé Bitteur */ public class StopWatch { //~ Instance fields -------------------------------------------------------- /** Name for this watch instance */ private final String name; /** Sequence of all tasks so far */ private final List<Task> tasks = new ArrayList<>(128); /** Current task (null if not running) */ private Task task; /** Current sum of tasks times */ private long total; //~ Constructors ----------------------------------------------------------- //-----------// // StopWatch // //-----------// /** * Creates a new StopWatch object. * * @param name name of the watch instance */ public StopWatch (String name) { this.name = name; } //~ Methods ---------------------------------------------------------------- //-------// // print // //-------// public void print () { print(System.out); } //-------// // print // //-------// public void print (PrintStream out) { stop(); final String format = "%5d %3d%% %s"; final String dashes = "-----------------------------------"; out.println(getClass().getSimpleName() + " \"" + name + "\""); out.println(dashes); out.println(" ms % Task"); out.println(dashes); for (Task t : tasks) { if (t != task) { out.println( String.format( format, t.elapsed, (total != 0) ? ((100 * t.elapsed) / total) : 100, t.label)); } } out.println(dashes); out.println(String.format(format, total, 100, "Total")); } //-------// // start // //-------// public void start (String label) { if (task != null) { stop(); } tasks.add(task = new Task(label)); } //------// // stop // //------// public void stop () { if (task != null) { task.elapsed = System.currentTimeMillis() - task.start; total += task.elapsed; task = null; } } //----------// // toString // //----------// @Override public String toString () { StringBuilder sb = new StringBuilder(getClass().getSimpleName()); sb.append(" \"") .append(name) .append("\""); sb.append(" tasks:") .append(tasks.size()); sb.append(" total:") .append(total); if (task != null) { sb.append(" running"); } else { sb.append(" stopped"); } return sb.toString(); } //~ Inner Classes ---------------------------------------------------------- //------// // Task // //------// private static class Task { //~ Instance fields ---------------------------------------------------- /** Label for this task */ private final String label; /** Start time */ private final long start; /** Elapsed time */ private long elapsed; //~ Constructors ------------------------------------------------------- public Task (String label) { this.label = label; start = System.currentTimeMillis(); } } }