import java.io.PrintWriter;
/**
* Prints time durations; used for development purposes only.
*
* No threads or system resources are harmed in the making of a stop watch. A
* stop watch simply remembers the start time (and elapsed time when paused) and
* prints the total "running" time when either {@link #mark} or
* {@link #stop} is called.
*
* {@link #stop} doesn't really stop anything. You can call stop as many times
* as you like and it will print the time elapsed since start. It would be easy
* to change this behavior, but I haven't needed to.
*
* @author Jim Menard, <a href="mailto:jimm@io.com">jimm@io.com</a>
*/
public class StopWatch {
protected String name;
protected long t0;
protected long elapsedTime;
protected PrintWriter out;
public StopWatch() {
this(null, null);
}
public StopWatch(String name) {
this(name, null);
}
public StopWatch(PrintWriter out) {
this(null, out);
}
public StopWatch(String name, PrintWriter out) {
this.name = name;
if (out == null)
this.out = new PrintWriter(System.err);
else
this.out = out;
elapsedTime = -1L; // So we can tell if we are ever started
}
/**
* Remembers the current time and prints a message.
*/
public void start() {
start(true);
}
/**
* Remembers the current time and prints a message if requested.
*
* @param printStarting
* if <code>true</code> and this stop watch has a name, print a
* message
*/
public void start(boolean printStarting) {
if (t0 != 0)
System.err.println("(warning: StopWatch already started; resetting)");
if (printStarting && name != null)
System.err.println("starting " + name);
elapsedTime = 0;
t0 = System.currentTimeMillis();
}
/**
* Pauses the stop watch.
*/
public void pause() {
long now = System.currentTimeMillis();
elapsedTime += now - t0;
t0 = 0;
}
/**
* Resumes the stop watch.
*/
public void resume() {
t0 = System.currentTimeMillis();
}
/**
* Prints the current elapsed time without stopping.
*/
public void mark() {
stop(null, true);
}
/**
* Prints the current elapsed time without stopping, along with the stop watch
* name if <var>printMark</var> is <code>true</code>.
*
* @param printMark
* if <code>true</code>, the stop watch name will be printed
*/
public void mark(boolean printMark) {
stop(null, printMark);
}
/**
* Prints the current elapsed time without stopping, along with the stop watch
* name and <var>msg</var>.
*
* @param msg
* a message to print
*/
public void mark(String msg) {
stop(msg, true);
}
/**
* Prints the current elapsed time without stopping, along with, along with
* the stop watch name if <var>printMark</var> is <code>true</code> and the
* <var>msg</var> if it's not <code>null</code>.
*
* @param msg
* a message to print
* @param printMark
* if <code>true</code>, the stop watch name will be printed
*/
public void mark(String msg, boolean printMark) {
stop(msg, printMark);
}
/**
* Stops the stop watch and prints the name of this stop watch and the current
* elapsed time.
*/
public void stop() {
stop(null, true);
}
/**
* Stops the stop watch and prints the name of this stop watch, <var>msg</var>
* if non-<code>null</code>, and the current elapsed time.
*
* @param msg
* a message to print; may be <code>null</code>
*/
public void stop(String msg) {
stop(msg, true);
}
/**
* Prints the current elapsed time, along with the stop watch name if
* <var>printMark</var> is <code>true</code> and the <var>msg</var> if
* it's not <code>null</code>.
*
* @param msg
* a message to print; may be <code>null</code>
* @param printName
* if <code>true</code>, the stop watch name will be printed
*/
public void stop(String msg, boolean printName) {
long now = System.currentTimeMillis();
if (elapsedTime == -1) {
System.err.println("(StopWatch" + (name != null ? (" \"" + name + '"') : "")
+ " was stopped without ever being started)");
return;
}
long total = elapsedTime;
if (t0 != 0)
total += now - t0;
String separator = null;
if (printName && name != null) {
System.err.print(name);
separator = ": ";
}
if (msg != null) {
if (separator != null)
System.err.print(' ');
System.err.print("(" + msg + ")");
separator = ": ";
}
if (separator != null)
System.err.print(separator);
System.err.println("" + (total / 1000.0) + " seconds");
}
}