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 .