如何通过减去2个nanoTime对象获得有意义的结果?

时间:2010-09-06 23:34:21

标签: java performance nanotime

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

long start = System.nanoTime();

...

long end = System.nanoTime();

如何从此获得毫秒数?

6 个答案:

答案 0 :(得分:42)

(end - start) / 1000000

1微秒= 1000纳秒

1毫秒= 1000微秒

请注意,结果将向下舍入,但您通常无法获得真正的纳秒精度(精度取决于操作系统)。来自nanoTime()上的Javadoc:

  

此方法提供纳秒级精度,但不提供        必须达到纳秒精度。

答案 1 :(得分:10)

另请注意,您可以使用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秒"那么你将不得不用这个解决方案进行进一步的处理。

答案 2 :(得分:3)

TimeUnit.NANOSECONDS.toMillis(end - start);

这就是全部!

答案 3 :(得分:2)

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

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

答案 4 :(得分: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 ) ;
}

答案 5 :(得分:0)

您可以使用System.currentTimeMillis()

警告:

  

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