Class Stopwatch
- java.lang.Object
-
- com.google.common.base.Stopwatch
-
@GwtCompatible(emulated=true) public final class Stopwatch extends java.lang.Object
An object that measures elapsed time in nanoseconds. It is useful to measure elapsed time using this class instead of direct calls toSystem.nanoTime()for a few reasons:- An alternate time source can be substituted, for testing or performance reasons.
- As documented by
nanoTime, the value returned has no absolute meaning, and can only be interpreted as relative to another timestamp returned bynanoTimeat a different time.Stopwatchis a more effective abstraction because it exposes only these relative values, not the absolute ones.
Basic usage:
Stopwatch stopwatch = Stopwatch.createStarted(); doSomething(); stopwatch.stop(); // optional Duration duration = stopwatch.elapsed(); log.info("time: " + stopwatch); // formatted string like "12.3 ms"Stopwatch methods are not idempotent; it is an error to start or stop a stopwatch that is already in the desired state.
When testing code that uses this class, use
createUnstarted(Ticker)orcreateStarted(Ticker)to supply a fake or mock ticker. This allows you to simulate any valid behavior of the stopwatch.Note: This class is not thread-safe.
Warning for Android users: a stopwatch with default behavior may not continue to keep time while the device is asleep. Instead, create one like this:
Stopwatch.createStarted( new Ticker() { public long read() { return android.os.SystemClock.elapsedRealtimeNanos(); } });- Since:
- 10.0
-
-
Field Summary
Fields Modifier and Type Field Description private longelapsedNanosprivate booleanisRunningprivate longstartTickprivate Tickerticker
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static java.lang.Stringabbreviate(java.util.concurrent.TimeUnit unit)private static java.util.concurrent.TimeUnitchooseUnit(long nanos)static StopwatchcreateStarted()Creates (and starts) a new stopwatch usingSystem.nanoTime()as its time source.static StopwatchcreateStarted(Ticker ticker)Creates (and starts) a new stopwatch, using the specified time source.static StopwatchcreateUnstarted()Creates (but does not start) a new stopwatch usingSystem.nanoTime()as its time source.static StopwatchcreateUnstarted(Ticker ticker)Creates (but does not start) a new stopwatch, using the specified time source.java.time.Durationelapsed()Returns the current elapsed time shown on this stopwatch as aDuration.longelapsed(java.util.concurrent.TimeUnit desiredUnit)Returns the current elapsed time shown on this stopwatch, expressed in the desired time unit, with any fraction rounded down.private longelapsedNanos()booleanisRunning()Stopwatchreset()Sets the elapsed time for this stopwatch to zero, and places it in a stopped state.Stopwatchstart()Starts the stopwatch.Stopwatchstop()Stops the stopwatch.java.lang.StringtoString()Returns a string representation of the current elapsed time.
-
-
-
Field Detail
-
ticker
private final Ticker ticker
-
isRunning
private boolean isRunning
-
elapsedNanos
private long elapsedNanos
-
startTick
private long startTick
-
-
Constructor Detail
-
Stopwatch
Stopwatch()
-
Stopwatch
Stopwatch(Ticker ticker)
-
-
Method Detail
-
createUnstarted
public static Stopwatch createUnstarted()
Creates (but does not start) a new stopwatch usingSystem.nanoTime()as its time source.- Since:
- 15.0
-
createUnstarted
public static Stopwatch createUnstarted(Ticker ticker)
Creates (but does not start) a new stopwatch, using the specified time source.- Since:
- 15.0
-
createStarted
public static Stopwatch createStarted()
Creates (and starts) a new stopwatch usingSystem.nanoTime()as its time source.- Since:
- 15.0
-
createStarted
public static Stopwatch createStarted(Ticker ticker)
Creates (and starts) a new stopwatch, using the specified time source.- Since:
- 15.0
-
isRunning
public boolean isRunning()
-
start
public Stopwatch start()
Starts the stopwatch.- Returns:
- this
Stopwatchinstance - Throws:
java.lang.IllegalStateException- if the stopwatch is already running.
-
stop
public Stopwatch stop()
Stops the stopwatch. Future reads will return the fixed duration that had elapsed up to this point.- Returns:
- this
Stopwatchinstance - Throws:
java.lang.IllegalStateException- if the stopwatch is already stopped.
-
reset
public Stopwatch reset()
Sets the elapsed time for this stopwatch to zero, and places it in a stopped state.- Returns:
- this
Stopwatchinstance
-
elapsedNanos
private long elapsedNanos()
-
elapsed
public long elapsed(java.util.concurrent.TimeUnit desiredUnit)
Returns the current elapsed time shown on this stopwatch, expressed in the desired time unit, with any fraction rounded down.Note: the overhead of measurement can be more than a microsecond, so it is generally not useful to specify
TimeUnit.NANOSECONDSprecision here.It is generally not a good idea to use an ambiguous, unitless
longto represent elapsed time. Therefore, we recommend usingelapsed()instead, which returns a strongly-typedDurationinstance.- Since:
- 14.0 (since 10.0 as
elapsedTime())
-
elapsed
@GwtIncompatible public java.time.Duration elapsed()
Returns the current elapsed time shown on this stopwatch as aDuration. Unlikeelapsed(TimeUnit), this method does not lose any precision due to rounding.- Since:
- 22.0
-
toString
public java.lang.String toString()
Returns a string representation of the current elapsed time.- Overrides:
toStringin classjava.lang.Object
-
chooseUnit
private static java.util.concurrent.TimeUnit chooseUnit(long nanos)
-
abbreviate
private static java.lang.String abbreviate(java.util.concurrent.TimeUnit unit)
-
-