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, jimm@io.com
*/
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 true
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 printMark is true
.
*
* @param printMark
* if true
, 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 msg.
*
* @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 printMark is true
and the
* msg if it's not null
.
*
* @param msg
* a message to print
* @param printMark
* if true
, 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, msg
* if non-null
, and the current elapsed time.
*
* @param msg
* a message to print; may be null
*/
public void stop(String msg) {
stop(msg, true);
}
/**
* Prints the current elapsed time, along with the stop watch name if
* printMark is true
and the msg if
* it's not null
.
*
* @param msg
* a message to print; may be null
* @param printName
* if true
, 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");
}
}