为什么System.nanoTime()需要4400纳秒?

5

我正在测试一些算法,并用纳秒计时器包围它们。当我随机忘记删除计时器时,我发现这段代码:

    a = System.nanoTime();
    System.out.println(System.nanoTime() - a);

在我的系统上,它总是打印出4400纳秒。这将是4.4微秒,而这段代码:

    a = System.currentTimeMillis();
    for (int i = 0; i < 1000; i++)
        System.nanoTime();
    System.out.println(System.currentTimeMillis() - a);

打印出0


5
顶级答案应该解释如何在Java中测量经过的时间。 - Sean F
这不是关于可能的精度吗?试试另一个处理器 :) - tomasb
2个回答

4
4400纳秒等于4.4微秒,或0.0044毫秒。第二个例子总是会打印零,因为经过的时间一毫秒还要短。然后有两个计时器之间的差异:currentTimeMillis可以针对时钟偏差进行调整,而nanoTime则不能,但我怀疑这里并不适用。

天啊,我太蠢了... 把微秒错写成毫秒了... 不管怎样,我已经更新了代码,但它仍然有点奇怪。 - Walter Lars Lee
1
实际系统计时器分辨率不一定是纳秒级别的。在您的情况下,它可能是4.4微秒(即最小可能增量)。 - Jim Garrison

0

使用nanoseconds()来测量自身可能不是实现者考虑的用例。通常,您会使用它来计时“慢”操作,或多次调用“快”操作,这些操作一起是“慢”的,其中“慢”是指超过0.1毫秒的任何操作。

您想要计时较长时间的操作的原因是nanoseconds()的粒度不够细-取决于硬件和操作系统,但远非纳秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接