Java 日历 getTimeInMillis() 返回同一时间
Java Calendar getTimeInMillis() Returning the Same Time
我有一段代码是这样的:
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 万次,所以 startTime
和 endTime
肯定会包含不同的值。
然而 totalTime
始终等于 0。
为什么 startTime
和 endTime
包含相同的值?
任何帮助将不胜感激 =)
tl;博士
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`.
捕捉当前时刻
您的代码正在捕获当前时刻,快照,冻结。结果对象未更新。这就是 class JavaDoc.
中的短语“特定时刻”的意思
要跟踪经过的时间,您必须捕获当前时刻两次,从而产生两个单独的对象。
避免遗留日期时间 classes
Calendar
class 很糟糕,多年前就被 java.time class 取代了JSR 310 的。具体来说,ZonedDateTime
替换了 GregorianCalendar
,Calendar
的通常实现。
Instant
跟踪当前时刻的现代方法使用 Instant
class。 Instant
表示 UTC 中的一个时刻。
Instant start = Instant.now() ;
… // Do some stuff.
Instant stop = Instant.now() ;
分辨率
在 Java 9 及更高版本中,当前时刻的捕获分辨率为微秒(小数秒的 6 位十进制数字)。在 Java 8 中,Clock
的旧实现 Instant 仅限于以毫秒(3 位十进制数字)捕获当前时刻。在 Java 的所有版本中,Instant
class 能够以纳秒(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:微基准套件
对于严格的基准测试,请查看基于 JMH. See JEP 230: Microbenchmark Suite 添加到 Java 12 及更高版本的新内置基准测试框架。
我有一段代码是这样的:
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 万次,所以 startTime
和 endTime
肯定会包含不同的值。
然而 totalTime
始终等于 0。
为什么 startTime
和 endTime
包含相同的值?
任何帮助将不胜感激 =)
tl;博士
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`.
捕捉当前时刻
您的代码正在捕获当前时刻,快照,冻结。结果对象未更新。这就是 class JavaDoc.
中的短语“特定时刻”的意思要跟踪经过的时间,您必须捕获当前时刻两次,从而产生两个单独的对象。
避免遗留日期时间 classes
Calendar
class 很糟糕,多年前就被 java.time class 取代了JSR 310 的。具体来说,ZonedDateTime
替换了 GregorianCalendar
,Calendar
的通常实现。
Instant
跟踪当前时刻的现代方法使用 Instant
class。 Instant
表示 UTC 中的一个时刻。
Instant start = Instant.now() ;
… // Do some stuff.
Instant stop = Instant.now() ;
分辨率
在 Java 9 及更高版本中,当前时刻的捕获分辨率为微秒(小数秒的 6 位十进制数字)。在 Java 8 中,Clock
的旧实现 Instant 仅限于以毫秒(3 位十进制数字)捕获当前时刻。在 Java 的所有版本中,Instant
class 能够以纳秒(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:微基准套件
对于严格的基准测试,请查看基于 JMH. See JEP 230: Microbenchmark Suite 添加到 Java 12 及更高版本的新内置基准测试框架。