Is System.nanoTime() in Java Truly Useless?
Question:
A blog post titled "Beware of System.nanoTime() in Java" raises concerns that on x86 systems, System.nanoTime() can potentially return incorrect time values due to the use of CPU-specific counters. In a multi-core system, thread scheduling could result in a processor with a lower counter being assigned, leading to negative values for time differences.
Answer:
The blog post's claims were written in 2011 and are no longer accurate. Subsequent operating system updates have resolved these issues on Windows and Linux.
Windows:
On Windows XP Service Pack 2 and later, System.nanoTime() uses the QueryPerformanceCounter/QueryPerformanceFrequency API, which is implemented by the Hardware Abstraction Layer (HAL) to provide a consistent time source across processors.
Linux:
The Linux clock_gettime(CLOCK_REALTIME) function ensures that time is consistent across all processors. As of kernel version 2.6.18, a safe clocksource is used if unsynced or variable frequency time-stamp counters are detected.
Other Architectures:
There is limited information available about other architectures, such as SPARC and Solaris. However, it is generally assumed that modern virtual machines (VMs) provide a consistent time source for guest operating systems, regardless of the underlying hardware.
Conclusion:
System.nanoTime() remains a valid method for measuring time differences in Java. The concerns raised in the 2011 blog post have been addressed and do not apply to modern system implementations.
The above is the detailed content of Is System.nanoTime() in Java Still a Reliable Time Measurement Tool?. For more information, please follow other related articles on the PHP Chinese website!