如何计算java中事件的经过时间?

时间:2008-10-27 02:02:26

标签: java timer clock

使用Java访问系统时钟的简单/简单方法是什么,以便我可以计算事件的已用时间?

6 个答案:

答案 0 :(得分:81)

我会避免使用System.currentTimeMillis()来衡量经过的时间。 currentTimeMillis()返回“挂钟”时间,该时间可能会发生变化(例如:夏令时,管理员用户更改时钟)并扭曲您的间隔测量值。

另一方面,

System.nanoTime()返回自“某个参考点”以来的纳秒数(例如,JVM启动),因此不会受到系统时钟变化的影响。

答案 1 :(得分:25)

这是一些示例代码。

long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();

System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");

答案 2 :(得分:9)

Apache Commons-Lang还有适合您的目的的StopWatch类。它使用System.currentTimeMillis(),所以你仍然会有解决问题,但你可以暂停和做单圈时间等。我现在将它用作事件统计数据的标准。

http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html

答案 3 :(得分:6)

Answer by Leigh是正确的。

java.time

Java 8及更高版本内置了java.time框架。

Instant是UTC时间轴上的一个时刻,具有纳秒级分辨率(最多9位小数秒)。 now方法获取当前的日期时间。

Instant now = Instant.now();
  

2016-03-12T04:29:39.123Z

您可以将一对Instant个对象之间的已用时间计算为Duration。持续时间使用纳秒分辨率,最大值可以保持很长的秒数。这大于当前估计的宇宙年龄。

Duration duration = Duration.between( startInstant , stopInstant );

Duration::toString的默认输出采用标准ISO 8601格式。您还可以要求总纳秒数(toNanos)或毫秒数(toMillis)以及其他金额。

Java 8

在Java 8中,获取当前时刻仅解析为毫秒分辨率(最多3位小数秒)。因此,虽然java.time类可以存储纳秒,但它们只能用毫秒来确定当前时刻。此限制是由于遗留问题(默认Clock实施使用System.currentTimeMillis())。

Java 9

在Java 9及更高版本中,默认的Clock实现可以确定高达纳秒分辨率的当前时刻。实际上,这取决于计算机时钟硬件的精细程度。

有关详细信息,请参阅此OpenJDK问题页面:Increase the precision of the implementation of java.time.Clock.systemUTC()

Micro Benchmark

如果您的目的是基准测试,请务必查看其他问题,例如:

框架可用于协助短期基准测试。

答案 4 :(得分:5)

java.lang.System.currentTimeMillis()java.lang.System.nanoTime()应该用来衡量已用时间。

答案 5 :(得分:3)

这是我使用System.nanoTime()编写的一个小型StopWatch类,如Leigh的回答所示:

public class StopWatch {
    // Constructor
    public StopWatch() {
    }

    // Public API
    public void start() {
        if (!_isRunning) {
            _startTime = System.nanoTime();
            _isRunning = true;
        }
    }

    public void stop() {
        if (_isRunning) {
            _elapsedTime += System.nanoTime() - _startTime;
            _isRunning = false;
        }
    }

    public void reset() {
        _elapsedTime = 0;
        if (_isRunning) {
            _startTime = System.nanoTime();
        }
    }

    public boolean isRunning() {
        return _isRunning;
    }

    public long getElapsedTimeNanos() {
        if (_isRunning) {
            return System.nanoTime() - _startTime;
        }
        return _elapsedTime;
    }

    public long getElapsedTimeMillis() {
        return getElapsedTimeNanos() / 1000000L;
    }

    // Private Members
    private boolean _isRunning = false;
    private long _startTime = 0;
    private long _elapsedTime = 0;
}