1

我在 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())?

谢谢,
迭戈。

4

0 回答 0