Java ThreadMXBean getCurrentThreadCpuTime Unix Windows不同的准确度

时间:2017-03-15 18:23:38

标签: java windows macos unix cpu-time

我正在Java中执行以下代码来打印经过的CPU时间(以纳秒和毫秒为单位):

        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的几个版本中都观察到了这一点。

有人知道为什么会这样吗?有没有更好的方法在Windows上以毫秒为单位测量CPU时间(即不需要System.nanoTime())?

谢谢,
迭。

0 个答案:

没有答案