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

Bla*_*man 12 java performance nanotime

我创建了一个监视请求长度的过滤器.

long start = System.nanoTime();

...

long end = System.nanoTime();
Run Code Online (Sandbox Code Playgroud)

我怎么能从这里得到毫秒数?

Chr*_*her 43

(end - start) / 1000000
Run Code Online (Sandbox Code Playgroud)

1微秒= 1000纳秒

1毫秒= 1000微秒

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

该方法提供纳秒精度,但不一定是纳秒精度.

  • 以防万一...精确度大致意味着小数位数(数字1.00000000000135738具有很高的精度),而精确度则说明有多少小数是正确的.例如,精度为0.01的1.0001可以介于1.0101和0.9901之间,而精度为0.000001的1.0保证介于0.000009和1.000001之间. (7认同)
  • 这是有效的,但它返回的数字是10或5而不是10.234234234或其他东西.我必须投吗? (2认同)
  • 因为nanoTime使用64位长,所以溢出只会在你有超过292年的连续调用时发生(http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html #nanoTime()) (2认同)
  • @MichaelClerx我想你的意思是在0.999999和1.000001之间。 (2认同)

小智 11

另请注意,您可以使用TimeUnit类来帮助进行转换.对于旧版本的Java,以下代码可能是将处理时间转换为其他时间格式的示例:

long startTime = System.nanoTime();

//Processing in-between.

long endTime = System.nanoTime();
long duration = endTime - startTime;
duration = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
Run Code Online (Sandbox Code Playgroud)

请注意,较新版本的Java在TimeUnit类中具有快捷方式.

上面的样本会将纳秒变成几秒钟.另请注意,这会截断它,因此您会失去一些精度.因此,如果切换到分钟,那么您将失去秒的精度.如果您想获得"12分32秒"的结果,则必须使用此解决方案进行进一步处理.


Yuj*_*are 9

TimeUnit.NANOSECONDS.toMillis(end - start);
Run Code Online (Sandbox Code Playgroud)

That's all!