001: package com.protomatter.util;
002:
003: /**
004: * {{{ The Protomatter Software License, Version 1.0
005: * derived from The Apache Software License, Version 1.1
006: *
007: * Copyright (c) 1998-2002 Nate Sammons. All rights reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution,
022: * if any, must include the following acknowledgment:
023: * "This product includes software developed for the
024: * Protomatter Software Project
025: * (http://protomatter.sourceforge.net/)."
026: * Alternately, this acknowledgment may appear in the software itself,
027: * if and wherever such third-party acknowledgments normally appear.
028: *
029: * 4. The names "Protomatter" and "Protomatter Software Project" must
030: * not be used to endorse or promote products derived from this
031: * software without prior written permission. For written
032: * permission, please contact support@protomatter.com.
033: *
034: * 5. Products derived from this software may not be called "Protomatter",
035: * nor may "Protomatter" appear in their name, without prior written
036: * permission of the Protomatter Software Project
037: * (support@protomatter.com).
038: *
039: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
040: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
041: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
042: * DISCLAIMED. IN NO EVENT SHALL THE PROTOMATTER SOFTWARE PROJECT OR
043: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
044: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
045: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
046: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
047: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
048: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
049: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
050: * SUCH DAMAGE. }}}
051: */
052:
053: /**
054: * A benchmarking utility class. Basically encapsulates a name,
055: * start time and end time.<P>
056: *
057: * Usually used like this:<P>
058: *
059: * <PRE>
060: * OpTimer timer = new OpTimer("Some long operation");
061: * ...
062: * // a lot of junk
063: * ...
064: * timer.stop();
065: * Syslog.debug(this, timer);
066: * </PRE><P>
067: *
068: * This class can be used in conjunction with the
069: * {@link OpTimerUtil OpTimerUtil} class, which can
070: * parse log files for timer traces and produce
071: * aggregate timing information.
072: *
073: * @see OpTimerUtil
074: */
075: public class OpTimer implements java.io.Serializable {
076: private String name = null;
077: private long start = 0;
078: private long stop = 0;
079: private boolean showThread = true;
080: private String threadName = null;
081:
082: /**
083: * Create a new timer with the given name. The timer
084: * is started when it is created.
085: */
086: public OpTimer(String name) {
087: this (name, true);
088: }
089:
090: /**
091: * Create a new timer with the given name. The timer
092: * is started when it is created.
093: */
094: public OpTimer(String name, boolean showThread) {
095: this .name = name;
096: this .showThread = showThread;
097: start();
098: }
099:
100: /**
101: * Re-start the timer. There's no need to call
102: * this method if you're not re-using timer instances.
103: * Returns this timer for convenience.
104: */
105: public OpTimer start() {
106: this .start = System.currentTimeMillis();
107: this .stop = 0;
108: if (showThread)
109: this .threadName = Thread.currentThread().getName();
110: return this ;
111: }
112:
113: /**
114: * Return elapsed time.
115: */
116: public long elapsed() {
117: return (this .stop != 0) ? (this .stop - this .start) : (System
118: .currentTimeMillis() - this .start);
119: }
120:
121: /**
122: * Get the name of this timer.
123: */
124: public String getName() {
125: return this .name;
126: }
127:
128: /**
129: * Set the name of this timer.
130: */
131: public void setName(String name) {
132: this .name = name;
133: }
134:
135: /**
136: * Get the start time of this timer.
137: */
138: public long startTime() {
139: return this .start;
140: }
141:
142: /**
143: * Get the time this timer was stopped. If
144: * the timer is still running, the stop time
145: * will be <TT>0</TT>.
146: */
147: public long stopTime() {
148: return this .stop;
149: }
150:
151: /**
152: * Stop the timer. Returns this timer instance for convenience.
153: */
154: public OpTimer stop() {
155: this .stop = System.currentTimeMillis();
156: return this ;
157: }
158:
159: public String toString() {
160: long now = System.currentTimeMillis();
161: return "OpTimer["
162: + this .name
163: + ", "
164: + (showThread ? ("thread=" + threadName + ", ") : "")
165: + ((stop == 0) ? "still running, " : "")
166: + "took "
167: + ((this .stop != 0) ? (this .stop - this .start)
168: : (now - this .start)) + "ms]";
169: }
170: }
|