Java Calendar getTimeInMillis()返回相同的时间

问题描述 投票:-4回答:1

我有一段这样的代码:

    Calendar c = Calendar.getInstance();
    long startTime = c.getTimeInMillis();

    while (x < 10000000) {//check all the integers from 1 to 10000000 to
                          //to see if they're prime or not}

    long endTime = c.getTimeInMillis();
    long totalTime = endTime - startTime;

循环运行1000万次,所以startTimeendTime肯定会包含不同的值。

但是totalTime总是等于0。

为什么startTimeendTime包含相同的值?

任何帮助将不胜感激=)

java milliseconds java.util.calendar
1个回答
2
投票

tl;dr

Duration.between(       // Represent a span-of-time as a count of nanoseconds, to be calculated as hours-minutes-seconds.
    then ,              // Earlier in your code, capture the previous current moment: `Instant then = Instant.now() ;`
    Instant.now()       // Capture the current moment. 
)                       // Returns a `Duration` object, our elapsed time.
.toNanos()              // Get the total number of nanoseconds in the entire span-of-time. Returns a `long`. 

Capturing current moment

您的代码捕获当前时刻,快照,冻结。生成的对象不会更新。这就是JavaDoc类中的“特定时刻”这个短语。

要跟踪已用时间,必须捕获当前时刻两次,从而生成两个单独的对象。

Avoid legacy date-time classes

Calendar类非常糟糕,几年前被java.time类取代,采用了JSR 310.具体来说,ZonedDateTime取代了GregorianCalendarCalendar的常用实现。

Instant

跟踪当前时刻的现代方法使用Instant类。 Instant代表UTC的一个时刻。

Instant start = Instant.now() ;
…  // Do some stuff.
Instant stop = Instant.now() ;

Resolution

在Java 9及更高版本中,当前时刻以微秒(小数秒的6位十进制数字)的分辨率捕获。在Java 8中,一个Instant,较早的Clock实现仅限于以毫秒(3个十进制数字)捕获当前时刻。在所有版本的Java中,Instant类都能够以纳秒(9位十进制数字)表示矩。但传统的计算机时钟无法准确地跟踪时间。

Duration

计算作为Duration对象的经过时间。

Duration duration = Duration.between( start , stop ) ;  // Represents a span of time in terms of hours-minutes-seconds.
long nanoseconds = duration.toNanos() ;                 // Converts this duration to the total length in nanoseconds expressed as a long.

System.nanoTime

对于微基准测试,您可能想要使用System.nanoTime()。从某个任意起点开始,该方法将当前时刻捕获为几纳秒。注意:根据任何时钟或日历,返回的值不代表当前时刻。但它可以用于跟踪可能比Instant更精细的分辨率的经过时间。

long start = System.nanoTime() ;  // Some arbitrarily defined count of nanoseconds. *NOT* the current time/date by any clock/calendar. 
…  // Do some stuff.
long stop = System.nanoTime() ;
long nanoseconds = ( stop - start ) ;

JEP 230:Microbenchmark Suite

对于严格的基准测试,请查看基于JMH添加到Java 12及更高版本的新内置基准测试框架。见JEP 230: Microbenchmark Suite

© www.soinside.com 2019 - 2024. All rights reserved.