Java ThreadMXBean getCurrentThreadCpuTime Unix Windows anderledes nøjagtighed

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg udfører følgende kode i Java for at udskrive den forløbne CPU-tid (både i nano og millisekunder):


        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++;
            }

        }


både i Mac og Windows:

 - Mac (MacOS Sierra, 10.12.3), Oracle JDK, 1.7.0\_79

 - Windows (Windows 10), Oracle JDK, 1.7.0\_71


På Mac får jeg følgende output (første kolonne er nanosekunder, anden kolonne millisekunder):


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

...


mens du er på Windows, er outputen:


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

...


Du kan se, hvordan Unix-udgangen er helt glat og kontinuerlig, mens i Windows hver iteration adskilles af flere (ca. 15) millisekunder.


Jeg har observeret dette i flere versioner af Java, Windows og Mac.


Har nogen en ide om hvorfor er dette sket? Er der en bedre måde at måle CPU-tid på (dvs. System.nanoTime () ikke ønsket) på Windows i millisekunder?


Tak,

Diego.

Bedste reference