使用Java获得精确的运行时间,精确到毫秒

使用Java获得精确的运行时间,精确到毫秒,java,time,elapsed,Java,Time,Elapsed,我一直在寻找我的困境的答案,并找到了一些有用的提示,但没有解决我的具体问题,所以我希望这里的人能够帮助我 我试图在Java中获得精确到毫秒的运行时间。我使用System.nanoTime()获取当前时间,并在以下代码中实现它。请注意,这是我用来测试其精度的代码 long startTime=System.nanoTime()/1000000 while(true) { System.out.println((System.nanoTime()/1000000)-startTime); } 输出的

我一直在寻找我的困境的答案,并找到了一些有用的提示,但没有解决我的具体问题,所以我希望这里的人能够帮助我

我试图在Java中获得精确到毫秒的运行时间。我使用System.nanoTime()获取当前时间,并在以下代码中实现它。请注意,这是我用来测试其精度的代码

long startTime=System.nanoTime()/1000000
while(true)
{
System.out.println((System.nanoTime()/1000000)-startTime);
}

输出的一部分如下所示

1110
1112
1112
1113
1114
1118
1120

第一个数字是秒数,第二个是十分之一秒,第三个是百分之一,最后一个是千分之一。你在这里看不到,但我精确到百分之一百——没有跳过或重复的数字。然而,千分之一远不精确。0 -> 2 -> 2 -> 3 -> 4 -> 8 -> 0. 对于我正在做的事情,我需要精确到千分之一,从我所读到的所有信息来看,似乎System.nanoTime()应该能够提供毫秒级的精度


我是做错了什么,还是有其他方法可以使精度达到毫秒?

在减法后除以一百万,然后使用
文字

long startTime = System.nanoTime();

while (true)
{
    System.out.println((System.nanoTime() - startTime)/1000000L);
}

演示(更新):

这里有两个因素

首先,即使是
System.nanoTime()
也不一定非常精确——它只使用可用的最佳时钟(并且不跟踪时钟变化,因此它从不向后或向前跳)

其次,Java程序不是计算机上运行的唯一程序,因此每次代码(本质上是对本机
nanoTime
函数的调用和结果的输出)所花费的时间不同。例如,可能一个输出需要超过一整毫秒,而另一个输出只需要半毫秒或更少

尝试输出更多的数字(即除以较小的数字),结果将有助于理解。

java.time 旧的日期时间类现在被java.time类取代

time类支持高达的解析。但请记住,实际分辨率和精度取决于主机的硬件时钟。所以你的结果会有所不同

2016-01-02T12:34:56.123456789Z

要将可能的分辨率降低为,请调用该方法

2016-01-02T12:34:56.123Z

请记住,大多数计算机硬件时钟在毫秒-微秒-纳秒的范围内都不是非常精确的



次要说明:虽然java.time类支持存储纳秒分辨率,但在java 8中,的传统实现仅限于以毫秒而不是纳秒捕获当前时刻。带来了一种新的方法,因此根据主机时钟硬件和主机操作系统的性能,可以以纳秒级的分辨率捕获当前时刻。

是什么让您认为结果不精确?您的代码不会每次在相同的毫秒数内执行。这样如何:这不会改变以下事实:循环不能保证以固定的间隔执行,这似乎是他所期望的。我猜我所期望的是毫秒会有规律地增加(0、1、2、3等)。十分之一和百分之一百是这样的。你是说毫秒内不会出现这种情况?@Antillies:你希望循环每毫秒运行一次吗?为什么?@Matt:我想我的印象是循环执行得很快。但我想我已经意识到,你们所说的,循环执行所需的时间造成了我认为不精确的结果。我的理解正确吗?这不是不精确,但是由于循环执行所需的时间,循环无法以毫秒的速度打印出来。谢谢大家的帮助。我想我对我现在要做的事情有了更好的想法。
Instant instant = Instant.now();  
Instant instantTruncated = Instant.now().trucatedTo( ChronoUnit.MILLIS );