-
Enhancement
-
Resolution: Won't Fix
-
P3
-
None
-
9
-
x86_64
-
windows_7
A DESCRIPTION OF THE REQUEST :
With [JDK-8068730](https://bugs.openjdk.java.net/browse/JDK-8068730) SystemClock uses more precise timestamp provider, but it uses incorrect timeprovider for Windows - [GetSystemTimeAsFileTime](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724397(v=vs.85).aspx) - [see commit](http://hg.openjdk.java.net/jdk9/jdk9/hotspot/rev/fca33371ff0b#l14.27) - that provides similar resolution as **System.currentTimeMillis**.
There is another timeprovider in WinAPI that gives wall-clock time with higher resolution - [GetSystemTimePreciseAsFileTime](https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895(v=vs.85).aspx)
JUSTIFICATION :
Clock.systemUTC in fact provides microsecond resolution on Linux/MacOSX, while Windows doesn't get any benefits ofJDK-8068730
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expecting sub-millisecond resolution
ACTUAL -
Results on Windows:
```
java.version:9-ea
took 68.991 us
clock diff 0 us
instants [2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z] us
diffs [0, 0, 0, 0, 0, 0, 0, 0, 0] us
```
Results on Linux:
```
$ ~/jdk9/bin/java ClockTest
java.version:9-ea
took 150.142 us
clock diff 135 us
instants [2017-05-12T10:49:05.227999Z, 2017-05-12T10:49:05.228126Z, 2017-05-12T10:49:05.228127Z, 2017-05-12T10:49:05.228129Z, 2017-05-12T10:49:05.228130Z, 2017-05-12T10:49:05.228131Z, 2017-05-12T10:49:05.228132Z, 2017-05-12T10:49:05.228132Z, 2017-05-12T10:49:05.228133Z, 2017-05-12T10:49:05.228134Z] us
diffs [127, 1, 2, 1, 1, 1, 0, 1, 1] us
```
---------- BEGIN SOURCE ----------
import java.time.Clock;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
/**
* @author vladimir.dolzhenko
* @since 2017-05-12
*/
public class ClockTest {
public static void main(String[] args) {
final Clock clock = Clock.systemUTC();
int count = 10;
Instant[] instants = new Instant[count];
final long start = System.nanoTime();
for (int i = 0; i < count; i++) {
instants[i] = clock.instant();
}
final long end = System.nanoTime();
System.out.println("java.version:" + System.getProperty("java.version"));
System.out.println("took " + (end - start) / 1e3 + " us");
System.out.println("clock diff " + ChronoUnit.MICROS.between(instants[0], instants[count - 1]) + " us");
long[] diffs = new long[count - 1];
for (int i = 1; i < count; i++) {
diffs[i - 1] = ChronoUnit.MICROS.between(instants[i - 1], instants[i]);
}
System.out.println("instants " + Arrays.toString(instants) + " us");
System.out.println("diffs " + Arrays.toString(diffs) + " us");
}
}
---------- END SOURCE ----------
With [
There is another timeprovider in WinAPI that gives wall-clock time with higher resolution - [GetSystemTimePreciseAsFileTime](https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895(v=vs.85).aspx)
JUSTIFICATION :
Clock.systemUTC in fact provides microsecond resolution on Linux/MacOSX, while Windows doesn't get any benefits of
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expecting sub-millisecond resolution
ACTUAL -
Results on Windows:
```
java.version:9-ea
took 68.991 us
clock diff 0 us
instants [2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z, 2017-05-12T11:28:36.489481500Z] us
diffs [0, 0, 0, 0, 0, 0, 0, 0, 0] us
```
Results on Linux:
```
$ ~/jdk9/bin/java ClockTest
java.version:9-ea
took 150.142 us
clock diff 135 us
instants [2017-05-12T10:49:05.227999Z, 2017-05-12T10:49:05.228126Z, 2017-05-12T10:49:05.228127Z, 2017-05-12T10:49:05.228129Z, 2017-05-12T10:49:05.228130Z, 2017-05-12T10:49:05.228131Z, 2017-05-12T10:49:05.228132Z, 2017-05-12T10:49:05.228132Z, 2017-05-12T10:49:05.228133Z, 2017-05-12T10:49:05.228134Z] us
diffs [127, 1, 2, 1, 1, 1, 0, 1, 1] us
```
---------- BEGIN SOURCE ----------
import java.time.Clock;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
/**
* @author vladimir.dolzhenko
* @since 2017-05-12
*/
public class ClockTest {
public static void main(String[] args) {
final Clock clock = Clock.systemUTC();
int count = 10;
Instant[] instants = new Instant[count];
final long start = System.nanoTime();
for (int i = 0; i < count; i++) {
instants[i] = clock.instant();
}
final long end = System.nanoTime();
System.out.println("java.version:" + System.getProperty("java.version"));
System.out.println("took " + (end - start) / 1e3 + " us");
System.out.println("clock diff " + ChronoUnit.MICROS.between(instants[0], instants[count - 1]) + " us");
long[] diffs = new long[count - 1];
for (int i = 1; i < count; i++) {
diffs[i - 1] = ChronoUnit.MICROS.between(instants[i - 1], instants[i]);
}
System.out.println("instants " + Arrays.toString(instants) + " us");
System.out.println("diffs " + Arrays.toString(diffs) + " us");
}
}
---------- END SOURCE ----------
- duplicates
-
JDK-8262437 Instant.now() returns same instant after first call
- Closed
- relates to
-
JDK-8196003 java.time Instant and Duration methods for microseconds
- Open
-
JDK-8242504 Enhance the system clock to nanosecond precision
- Resolved