Java ThreadMXBean getCurrentThreadCpuTime Unix Windows отличается точностью

Я выполняю следующий код в Java для печати истекшего времени процессора (как в нано, так и в миллисекундах):

        ThreadMXBean bean = ManagementFactory.getThreadMXBean();
        long t = bean.getCurrentThreadCpuTime();

        int c = 0;
        while (c < 100) {
            long u = bean.getCurrentThreadCpuTime();
            if (t != u) {
                System.out.println(u + " " + (u / 1000000.0));
                t = u;
                c++;
            }

        }

как в Mac, так и в Windows:
- Mac (macOS Sierra, 10.12.3), Oracle JDK, 1.7.0_79
- Windows (Windows 10), Oracle JDK, 1.7.0_71

На Mac я получаю следующий вывод (первый столбец - наносекунды, второй столбец - миллисекунды):

152955000 152,955
153749000 153,749
156080000 156,08
156161000 156,161
156205000 156.205
156246000 156,246
156301000 156,301
156364000 156,364
156429000 156,429
156471000 156,471
156513000 156,513
156552000 156,552
156603000 156.603
156645000 156,645
156691000 156,691
156731000 156,731
156787000 156,787
...

в то время как на Windows вывод:

109375000 109,375
125000000 125,0
140625000 140,625
156250000 156,25
171875000 171,875
187500000 187,5
203125000 203,125
218750000 218,75
234375000 234,375
250000000 250,0
265625000 265,625
281250000 281,25
296875000 296,875
312500000 312,5
328125000 328,125
343750000 343,75
359375000 359,375
...

Вы можете заметить, что вывод Unix является абсолютно плавным и непрерывным, в то время как в Windows каждая итерация разделяется несколькими (около 15) миллисекундами.

Я наблюдал это в нескольких версиях Java, Windows и Mac.

Кто-нибудь имеет представление о том, почему это происходит? Есть ли лучший способ измерить процессорное время (т.е. System.nanoTime() не требуется) в Windows в миллисекундах?

Спасибо,
Диего.

0 ответов

Другие вопросы по тегам