001: /* Copyright (c) 2001-2005, The HSQL Development Group
002: * All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * Redistributions of source code must retain the above copyright notice, this
008: * list of conditions and the following disclaimer.
009: *
010: * Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * Neither the name of the HSQL Development Group nor the names of its
015: * contributors may be used to endorse or promote products derived from this
016: * software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
022: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package org.hsqldb.lib;
032:
033: /**
034: * Provides the programatic analog of a physical stop watch. <p>
035: *
036: * The watch can be started, stopped and zeroed and can be queried for
037: * elapsed running time. The watch accumulates elapsed time over starts
038: * and stops such that only the time actually spent running is recorded.
039: * If the watch is zeroed, then the accumulated time is discarded and
040: * the watch starts again with zero acumulated time. <p>
041: *
042: * @author boucherb@users
043: * @version 1.7.2
044: * @since 1.7.2
045: */
046: public class StopWatch {
047:
048: /**
049: * The last time this object made the transition
050: * from stopped to running state, as reported
051: * by System.currentTimeMillis().
052: */
053: private long startTime;
054: private long lastStart;
055:
056: /**
057: * The accumulated running time of this object since
058: * it was last zeroed.
059: */
060: private long total;
061:
062: /** Flags if this object is started or stopped. */
063: boolean running = false;
064:
065: /** Creates, zeros, and starts a new StopWatch */
066: public StopWatch() {
067: this (true);
068: }
069:
070: /** Creates, zeros, and starts a new StopWatch */
071: public StopWatch(boolean start) {
072:
073: if (start) {
074: start();
075: }
076: }
077:
078: /**
079: * Retrieves the accumulated time this object has spent running since
080: * it was last zeroed.
081: * @return the accumulated time this object has spent running since
082: * it was last zeroed.
083: */
084: public long elapsedTime() {
085:
086: if (running) {
087: return total + System.currentTimeMillis() - startTime;
088: } else {
089: return total;
090: }
091: }
092:
093: /**
094: * Retrieves the accumulated time this object has spent running since
095: * it was last started.
096: * @return the accumulated time this object has spent running since
097: * it was last started.
098: */
099: public long currentElapsedTime() {
100:
101: if (running) {
102: return System.currentTimeMillis() - startTime;
103: } else {
104: return 0;
105: }
106: }
107:
108: /** Zeros accumulated running time and restarts this object. */
109: public void zero() {
110:
111: total = 0;
112:
113: start();
114: }
115:
116: /**
117: * Ensures that this object is in the running state. If this object is not
118: * running, then the call has the effect of setting the <code>startTime</code>
119: * attribute to the current value of System.currentTimeMillis() and setting
120: * the <code>running</code> attribute to <code>true</code>.
121: */
122: public void start() {
123: startTime = System.currentTimeMillis();
124: running = true;
125: }
126:
127: /**
128: * Ensures that this object is in the stopped state. If this object is
129: * in the running state, then this has the effect of adding to the
130: * <code>total</code> attribute the elapsed time since the last transition
131: * from stopped to running state and sets the <code>running</code> attribute
132: * to false. If this object is not in the running state, this call has no
133: * effect.
134: */
135: public void stop() {
136:
137: if (running) {
138: total += System.currentTimeMillis() - startTime;
139: running = false;
140: }
141: }
142:
143: public void mark() {
144: stop();
145: start();
146: }
147:
148: /**
149: * Retrieves prefix + " in " + elapsedTime() + " ms."
150: * @param prefix The string to use as a prefix
151: * @return prefix + " in " + elapsedTime() + " ms."
152: */
153: public String elapsedTimeToMessage(String prefix) {
154: return prefix + " in " + elapsedTime() + " ms.";
155: }
156:
157: /**
158: * Retrieves prefix + " in " + elapsedTime() + " ms."
159: * @param prefix The string to use as a prefix
160: * @return prefix + " in " + elapsedTime() + " ms."
161: */
162: public String currentElapsedTimeToMessage(String prefix) {
163: return prefix + " in " + currentElapsedTime() + " ms.";
164: }
165:
166: /**
167: * Retrieves the internal state of this object, as a String.
168: *
169: * The retreived value is:
170: *
171: * <pre>
172: * super.toString() +
173: * "[running=" +
174: * running +
175: * ", startTime=" +
176: * startTime +
177: * ", total=" +
178: * total + "]";
179: * </pre>
180: * @return the state of this object, as a String
181: */
182: public String toString() {
183: return super .toString() + "[running=" + running
184: + ", startTime=" + startTime + ", total=" + total + "]";
185: }
186: }
|