我创建了一个过滤器来监控请求的长度。
long start = System.nanoTime();
...
long end = System.nanoTime();
我该如何从现在开始计算得到毫秒数?
我创建了一个过滤器来监控请求的长度。
long start = System.nanoTime();
...
long end = System.nanoTime();
我该如何从现在开始计算得到毫秒数?
(end - start) / 1000000
1微秒=1000纳秒
1毫秒=1000微秒
请注意,结果将向下舍入,但通常你也无法获得真正的纳秒精度(精度取决于操作系统)。从nanoTime()
的Javadoc中可以了解到:
该方法提供纳秒级精度,但不一定具有纳秒级准确性。
TimeUnit#toMillis(long) (since Java 5)
的意思是将给定的时间段转换为毫秒数,这个方法从Java 5开始可用。TimeUnit.NANOSECONDS.toMillis(end - start);
或者
Duration#toMillis()(自Java 8以来)
Duration.ofNanos(end - start).toMillis()
OR
Duration#between(Temporal, Temporal) (自 Java 8 开始)
Instant start = Instant.now();
...
Instant end = Instant.now();
Duration.between(start, end).toMillis()
或者
ChronoUnit.html#between(Temporal, Temporal)(自Java 8以来)
Instant start = Instant.now();
...
Instant end = Instant.now();
ChronoUnit.MILLIS.between(start, end)
另外需要注意的是,你可以使用TimeUnit类来帮助进行单位转换。在旧版本的Java中,以下代码可能是将处理时间转换为其他时间格式的示例:
long startTime = System.nanoTime();
//Processing in-between.
long endTime = System.nanoTime();
long duration = endTime - startTime;
duration = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
请注意,较新版本的Java在TimeUnit类中提供了快捷方式。
上述示例将把纳秒转换为秒。还要注意,这会截断一些精度。因此,如果您切换到分钟,则会丢失秒的精度。如果您想获得“12分钟32秒”的结果,则需要对此解决方案进行进一步处理。
为了获得有意义的结果:
void procedure ( ... )
{
...
}
double measureProcedure ( double epsilon , ... )
{
double mean ;
double stderr = 2 * epsilon ;
while ( stderr > epsilon )
{
long start = System.nanoTime();
procedure ( ... ) ;
long end = System.nanoTime();
// recalculate mean , stderr
}
return ( mean / 1000000 ) ;
}
(end - start) / (double) 1000000
(或者如果你想要浮点数,可以使用(end - start) / 1000000.
或者(end - start) / (float) 1000000
) - Chris Lercher