Java-календарь getTimeInMillis (), возвращающий то же самое время - PullRequest
0 голосов
/ 31 марта 2019

У меня есть такой фрагмент кода:

    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;

Цикл выполняется 10 миллионов раз, поэтому startTime и endTime будут содержать разные значения.

Однако totalTime всегда равно 0.

Почему startTime и endTime содержат одно и то же значение?

Любая помощь будет признательна =)

1 Ответ

2 голосов
/ 31 марта 2019

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`. 

Захват текущего момента

Ваш код захватывает текущий момент, снимок, заморожен.Полученный объект не обновлен.Вот что означает фраза «определенный момент времени» в классе JavaDoc.

Для отслеживания прошедшего времени необходимо зафиксировать текущий момент дважды , в результате чего получаются два отдельных объекта.

Избегайте устаревших классов даты и времени

Класс Calendar ужасен и был вытеснен несколько лет назад классами java.time с принятием JSR 310. В частностиZonedDateTime заменяет GregorianCalendar, обычная реализация Calendar.

Instant

Современный подход к отслеживанию текущего момента использует класс Instant.Instant представляет момент в UTC.

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

Разрешение

В 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

Для серьезного бенчмаркинга ознакомьтесь с недавно встроенной платформой бенчмаркинга, добавленной в Java 12 и более поздние версии на основе JMH .См. JEP 230: Microbenchmark Suite .

...