Development Java Tutorial

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");
  }
}