Top Description Fields Constructors Methods
com.google.common.base

public final Class Stopwatch

extends Object
Class Inheritance
Annotations
@GwtCompatible
emulated:true
@SuppressWarnings:GoodTime
@ElementTypesAreNonnullByDefault
Static Imports
com.google.common.base.Preconditions.checkNotNull, .Preconditions.checkState, java.util.concurrent.TimeUnit.DAYS, .TimeUnit.HOURS, .TimeUnit.MICROSECONDS, .TimeUnit.MILLISECONDS, .TimeUnit.MINUTES, .TimeUnit.NANOSECONDS, .TimeUnit.SECONDS

An object that accurately measures elapsed time: the measured duration between two successive readings of "now" in the same process.

In contrast, wall time is a reading of "now" as given by a method like System#currentTimeMillis(), best represented as an java.time.Instant. Such values can be subtracted to obtain a Duration (such as by Duration.between), but doing so does not give a reliable measurement of elapsed time, because wall time readings are inherently approximate, routinely affected by periodic clock corrections. Because this class (by default) uses System#nanoTime, it is unaffected by these changes.

Use this class instead of direct calls to System#nanoTime for two reasons:

The one downside of Stopwatch relative to System#nanoTime() is that Stopwatch requires object allocation and additional method calls, which can reduce the accuracy of the elapsed times reported. Stopwatch is still suitable for logging and metrics where reasonably accurate values are sufficient. If the uncommon case that you need to maximize accuracy, use System.nanoTime() directly instead.

Basic usage:

Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop(); // optional

Duration duration = stopwatch.elapsed();

log.info("time: " + stopwatch); // formatted string like "12.3 ms"

The state-changing 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) or createStarted(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(); // requires API Level 17
       }
     });
Author
Kevin Bourrillion
Since
10.0

Field Summary

Modifier and TypeField and Description
private long
private boolean
private long
private final Ticker

Constructor Summary

AccessConstructor and Description
pack-priv
pack-priv
Stopwatch(Ticker ticker)

Method Summary

Modifier and TypeMethod and Description
private static String
private static TimeUnit
chooseUnit(long nanos)

public static Stopwatch
createStarted()

Creates (and starts) a new stopwatch using System#nanoTime as its time source.

public static Stopwatch
createStarted(Ticker ticker)

Creates (and starts) a new stopwatch, using the specified time source.

public static Stopwatch
createUnstarted()

Creates (but does not start) a new stopwatch using System#nanoTime as its time source.

public static Stopwatch
createUnstarted(Ticker ticker)

Creates (but does not start) a new stopwatch, using the specified time source.

public long
elapsed(TimeUnit desiredUnit)

Returns the current elapsed time shown on this stopwatch, expressed in the desired time unit, with any fraction rounded down.

public Duration
elapsed()

Returns the current elapsed time shown on this stopwatch as a Duration.

private long
public boolean
isRunning()

Returns true if start() has been called on this stopwatch, and stop() has not been called since the last call to start().

public Stopwatch

Returns:

this Stopwatch instance
reset
()

Sets the elapsed time for this stopwatch to zero, and places it in a stopped state.

public Stopwatch

Returns:

this Stopwatch instance
start
()

Starts the stopwatch.

public Stopwatch

Returns:

this Stopwatch instance
stop
()

Stops the stopwatch.

public String
toString()

Overrides java.lang.Object.toString.

Returns a string representation of the current elapsed time.
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait

Field Detail

elapsedNanosback to summary
private long elapsedNanos
isRunningback to summary
private boolean isRunning
startTickback to summary
private long startTick
tickerback to summary
private final Ticker ticker

Constructor Detail

Stopwatchback to summary
pack-priv Stopwatch()
Stopwatchback to summary
pack-priv Stopwatch(Ticker ticker)

Method Detail

abbreviateback to summary
private static String abbreviate(TimeUnit unit)
chooseUnitback to summary
private static TimeUnit chooseUnit(long nanos)
createStartedback to summary
public static Stopwatch createStarted()

Creates (and starts) a new stopwatch using System#nanoTime as its time source.

Since
15.0
createStartedback to summary
public static Stopwatch createStarted(Ticker ticker)

Creates (and starts) a new stopwatch, using the specified time source.

Since
15.0
createUnstartedback to summary
public static Stopwatch createUnstarted()

Creates (but does not start) a new stopwatch using System#nanoTime as its time source.

Since
15.0
createUnstartedback to summary
public static Stopwatch createUnstarted(Ticker ticker)

Creates (but does not start) a new stopwatch, using the specified time source.

Since
15.0
elapsedback to summary
public long elapsed(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#NANOSECONDS precision here.

It is generally not a good idea to use an ambiguous, unitless long to represent elapsed time. Therefore, we recommend using elapsed() instead, which returns a strongly-typed Duration instance.

Since
14.0 (since 10.0 as elapsedTime())
elapsedback to summary
public Duration elapsed()

Returns the current elapsed time shown on this stopwatch as a Duration. Unlike elapsed(TimeUnit), this method does not lose any precision due to rounding.

Annotations
@J2ktIncompatible
@GwtIncompatible
@J2ObjCIncompatible
Since
22.0
elapsedNanosback to summary
private long elapsedNanos()
isRunningback to summary
public boolean isRunning()

Returns true if start() has been called on this stopwatch, and stop() has not been called since the last call to start().

resetback to summary
public Stopwatch reset()

Sets the elapsed time for this stopwatch to zero, and places it in a stopped state.

Returns:Stopwatch

this Stopwatch instance

Annotations
@CanIgnoreReturnValue
startback to summary
public Stopwatch start()

Starts the stopwatch.

Returns:Stopwatch

this Stopwatch instance

Annotations
@CanIgnoreReturnValue
Exceptions
IllegalStateException:
if the stopwatch is already running.
stopback to summary
public Stopwatch stop()

Stops the stopwatch. Future reads will return the fixed duration that had elapsed up to this point.

Returns:Stopwatch

this Stopwatch instance

Annotations
@CanIgnoreReturnValue
Exceptions
IllegalStateException:
if the stopwatch is already stopped.
toStringback to summary
public String toString()

Overrides java.lang.Object.toString.

Returns a string representation of the current elapsed time.

Returns:String

Doc from java.lang.Object.toString.

a string representation of the object.

Annotations
@Override