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;
}