相关疑难解决方法(0)

为什么新的Java 8 Date Time API没有纳秒精度?

Java 8中新的Date Time API的一个特性应该是纳秒精度.但是,当我将当前日期时间打印到控制台时,就像这样

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
System.out.println(OffsetDateTime.now().format(formatter)); 
Run Code Online (Sandbox Code Playgroud)

我只看到毫秒精度:2015-11-02T12:33:26,746000000 + 0100

操作系统似乎确实支持纳秒精度.当我通过终端打印当前日期时间

date -Ins
Run Code Online (Sandbox Code Playgroud)

我看到2015-11-02T12:33:26,746134417 + 0100

如何在Java中获得纳秒精度?我在Ubuntu 14.04 64位上运行Oracle Java 1.8.0_66

java java-8 java-time

72
推荐指数
2
解决办法
1万
查看次数

System.nanoTime()的精度与准确度

文件System.nanoTime()说明如下(强调我的).

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.返回的值表示纳秒,因为某些固定但是任意时间(可能在将来,因此值可能为负).该方法提供纳秒精度,但不一定是纳秒精度.不保证值的变化频率.

在我看来,这可以用两种不同的方式解释:

  1. 上面粗体的句子是指个人返回值.然后,从数值意义上理解精度和准确度.也就是说,精度指的是有效数字的数量 - 截断的位置,精确度是指数字是否正确(如前面的答案 中所述,'精确'和'准确度'之间有什么区别?)

  2. 上面粗体的句子指的是方法本身的能力.然后,精确度和准确性将被理解为飞镖类比(http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_precision:_the_target_analogy).因此,低精度,高精度=>错误的值被高精度地反复击中:想象物理时间静止不动,nanoTime()的连续调用返回相同的数值,但是它与实际经过的时间有关.参考时间通过一些常数偏移.

哪种解释是正确的?我的观点是,解释2意味着使用nanoTime()(通过减去两个返回值)测量时间将是正确的纳秒(因为测量中的常数误差/偏移将被消除),而解释1将不会不能保证测量之间的一致性,因此不一定意味着高精度的时间差测量.


2013年 4月15日更新: Java 7文档System.nanoTime()已更新,以解决可能与以前的措辞混淆.

返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位.

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.返回的值表示纳秒,因为某些固定但任意的原始时间(可能在将来,因此值可能为负).在Java虚拟机的实例中,此方法的所有调用都使用相同的原点; 其他虚拟机实例可能使用不同的来源.

这种方法提供纳秒级精度,但不一定是纳秒级分辨率(即,值的变化频率) - 除了分辨率至少与分辨率一样好之外,不做任何保证currentTimeMillis().

跨越大于约292年(2 63纳秒)的连续调用的差异将无法正确计算由于数值溢出而导致的经过时间.

仅当计算在Java虚拟机的同一实例中获得的两个此类值之间的差异时,此方法返回的值才有意义.

java nanotime

24
推荐指数
3
解决办法
1万
查看次数

为什么我使用System.nanoTime()获得负时间?

我正在尝试使用以下代码System.nanoTime()来测量代码的已用时间.

public static void main(String[] args) throws Exception {
    while (true) {
        long start = System.nanoTime();
        for (int i = 0; i < 10000; i++)
            ;
        long end = System.nanoTime();
        long cost = end - start;
        if (cost < 0) {
            System.out.println("start: " + start + ", end: " + end + ", cost: " + cost);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了这样的结果:

start: 34571588742886, end: 34571585695366, cost: -3047520
start: 34571590239323, end: 34571586847711, cost: -3391612
start: 34571651240343, end: 34571648928369, cost: …
Run Code Online (Sandbox Code Playgroud)

java nanotime

15
推荐指数
1
解决办法
3644
查看次数

标签 统计

java ×3

nanotime ×2

java-8 ×1

java-time ×1