java timer计算时间间隔_timer-如何计算Java中事件的经过时间?

timer-如何计算Java中事件的经过时间?

这个问题已经在这里有了答案:

如何在Java中计时方法的执行时间?                                     38个答案

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

kafuchau asked 2020-01-03T21:46:42Z

6个解决方案

81 votes

我会避免使用System.nanoTime()测量经过时间。 System.nanoTime()返回“挂钟”时间,该时间可能会更改(例如:夏时制,管理员用户更改时钟)并会使间隔测量值偏斜。

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

Leigh answered 2020-01-03T21:47:05Z

25 votes

这是一些示例代码。

long startTime = System.currentTimeMillis();

// Run some code;

long stopTime = System.currentTimeMillis();

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

jjnguy answered 2020-01-03T21:47:25Z

9 votes

Apache Commons-Lang还具有StopWatch类,该类仅适合您的目的。 它使用System.currentTimeMillis(),因此您仍然会遇到分辨率问题,但是您可以暂停并执行单圈时间等。 现在,我将其作为事件统计信息的标准配置。

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

Spencer Kormos answered 2020-01-03T21:47:50Z

7 votes

雷的答案是正确的。

java.time

Java 8和更高版本具有内置的java.time框架。

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

Instant now = Instant.now();

2016-03-12T04:29:39.123Z

您可以将两个Clock对象之间的经过时间计算为Clock。持续时间使用纳秒分辨率,最大值可以长时间保留。 这比目前估计的宇宙年龄还大。

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

Clock的默认输出为标准ISO 8601格式。 您还可以要求总计数为纳秒(Clock)或毫秒(Clock),以及其他数量。

Java 8

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

Java 9

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

有关更多信息,请参见此OpenJDK问题页面:提高java.time.Clock.systemUTC()的实现精度

微型基准

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

如何在Java中编写正确的微基准测试?

使用Java创建快速/可靠的基准测试?

可以使用框架来协助进行短期基准测试。

Basil Bourque answered 2020-01-03T21:49:22Z

5 votes

java.lang.System.currentTimeMillis()或java.lang.System.nanoTime()应该可以测量经过的时间。

tvanfosson answered 2020-01-03T21:49:42Z

3 votes

这是我根据Leigh的答案使用System.nanoTime()编写的一个小型StopWatch类:

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;

}

Wilhem Meignan answered 2020-01-03T21:50:02Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值