17

System.currentTimeMillis() 是 Java 中时间性能的最佳度量吗?使用它来比较采取行动之前的时间和采取行动之后的时间时是否有任何问题?有更好的选择吗?

4

6 回答 6

13

我希望不会 - 这是我不使用时使用的东西nanoTime()

于 2009-07-02T09:16:09.373 回答
2

此外System.nanoTime(),JMX 可能是最好的可行选择:

java.lang.management.ManagementFactory.getThreadMXBean()

您可以查询当前线程cpu时间(以纳秒为单位但不以纳秒精度测量,如System.nanoTime())

于 2009-07-02T09:20:47.040 回答
2

您可以使用来自 Google Guava 的秒表,这使得测量时间变得非常容易。

于 2014-04-10T07:47:55.310 回答
1

如果您需要单调时间测量,System.nanoTime 是更好的选择。System.currentTimeMillis 受 UTC 时间变化的影响——闰秒、NTP 更新和抖动,以及用户设置系统时钟*。这可能会在某些类型的计时应用程序中导致一些惊人的失败。System.nanoTime 应该不受所有这些影响。

System.nanoTime 的问题包括周期性数值溢出和长期计时不准确,使 System.currentTimeMillis 更适合更长的时间跨度(前提是用户不理会系统时钟)。请注意,夏令时和时区更改不应影响 System.currentTimeMillis。

*Windows“与互联网时间同步”进行逐步更改。与通过调整客户端时基频率来“追逐”服务器的适当 NTP 客户端实现相反,这可能非常具有破坏性。

于 2011-11-13T21:14:26.270 回答
0

在 Java 1.5 之前只有 System.currentTimeMillis。但是,值的粒度取决于底层操作系统并且可能很大。在 Windows XP 上,我有时会以 20 毫秒的间隔结束。我听说 Linux 的差距在 1-2ms 范围内要好得多。

在 Java 1.5 中,您还可以使用 System.nanoTime。我从来没有遇到过这个问题。

于 2009-07-02T09:17:08.870 回答
-1

一个问题是,它测量的是实际经过的时间,而不是 CPU 时间——因此它非常依赖于系统负载。如果您在其他免费的机器上,这很好,但如果其他进程正在尝试工作,有时会产生有趣的结果。

这篇文章对这个问题有一个有趣的解决方案。

于 2009-07-02T09:19:41.207 回答