13

我创建了一个过滤器来监控请求的长度。

long start = System.nanoTime();

...

long end = System.nanoTime();

我现在如何从中获得毫秒数?

4

6 回答 6

47
(end - start) / 1000000

1 微秒 = 1000 纳秒

1 毫秒 = 1000 微秒

请注意,结果将四舍五入,但您通常不会获得真正的纳秒精度(精度取决于操作系统)。从 Javadoc 开始nanoTime()

此方法提供纳秒精度,但不一定提供纳秒精度。

于 2010-09-06T23:39:18.807 回答
12

另请注意,您可以使用 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 秒”的结果,则必须使用此解决方案进行进一步处理。

于 2014-05-20T18:07:51.883 回答
10

TimeUnit#toMillis(long)

TimeUnit.NANOSECONDS.toMillis(end - start);

就这样!

于 2017-08-04T17:40:02.280 回答
2

只需减去它们并将结果除以 10^6。

1 纳秒是 10^-9 秒,相应地是 10^-6 毫秒。
http://en.wikipedia.org/wiki/Nano-

于 2010-09-06T23:38:01.203 回答
1

要获得有意义的结果:

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 ) ;
}
于 2010-09-07T01:35:00.577 回答
0

你可以只使用System.currentTimeMillis().

警告:

请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

于 2010-09-06T23:50:33.293 回答