001    /*
002     * StopWatch.java
003     *
004     * Created on September 25, 2003, 1:53 PM
005     */
006    
007    package cs101.util;
008    
009    /**
010     * A stopwatch for timing the execution of code. This class is intended to
011     * provide aproximate time of execution to a resolution of single digit
012     * miliseconds on most modern machines.  Estimates of cost on a dual
013     * Athlon MP 2000+ machien yeild the following costs for the following methods
014     * <ul>
015     * <li><code>start()</code> takes aprox 0.000269 seconds
016     * <li><code>stop()</code> takes aprox 0.000570 seconds
017     * <li><code>reset()</code> takes aprox 0.000274 seconds
018     * <li><code>elapsed()</code> takes aprox 0.000278 seconds (stopped)
019     * <li><code>look()</code> takes aprox 0.006071 seconds(stopped)
020     * <li><code>elapsed()</code> takes aprox 0.000285 seconds (running)
021     * <li><code>look()</code> takes aprox 0.006209 seconds (running)
022     * </ul>
023     *
024     * @author  Gus Heck (gus.heck@olin.edu)
025     * @version $Id: StopWatch.java,v 1.1 2003/10/16 20:40:51 gus Exp $
026     */
027    public class StopWatch {
028        
029        public static long MS_SEC = 1000l;
030        public static long MS_MIN = 60000l;
031        public static long MS_HOUR = 3600000l;
032        
033        private long started;
034        private long startedFrom;
035        private long stopped;
036        private boolean running;
037        
038        /** Creates a new instance of StopWatch. */
039        public StopWatch() {
040            stop();
041            reset();
042        }
043        
044        /**
045         * Start the stopwatch.
046         */
047        public void start() {
048            running = true;
049            started = System.currentTimeMillis();
050        }
051        
052        /**
053         * Stop the stopwatch.
054         */
055        public void stop() {
056            stopped = System.currentTimeMillis();
057            running = false;
058            startedFrom = elapsed();
059        }
060        
061        /**
062         * Reset the stopwatch. It is perfectly legal and reasonable to
063         * reset the stopwatch while it is still running. The elapsed time on
064         * the stopwatch is set to 0 regardless.
065         */
066        public void reset() {
067            stopped = started = System.currentTimeMillis();
068            startedFrom = 0;
069        }
070        
071        public long elapsed() {
072            long time = System.currentTimeMillis();
073            return ((running ? time : stopped) - started) 
074                    + startedFrom;
075        }
076        
077        public String look() {
078            StringBuffer elapsedTime = new StringBuffer();
079            
080            long time = elapsed();
081            long ms = time % MS_SEC;
082            long sec = (time % MS_MIN)/MS_SEC;
083            long min = (time % MS_HOUR)/MS_MIN;
084            long hour = time/MS_HOUR;
085            
086            elapsedTime.append(hour + " hours ");
087            elapsedTime.append(min + " minutes ");
088            elapsedTime.append(sec + "." + ms + " seconds ");
089            elapsedTime.append("have elapsed.");
090            
091            return elapsedTime.toString();
092        }
093    }