System.currentTimeMillis()是Java中时间性能的最佳度量吗?

System.currentTimeMillis()是Java中时间性能的最佳度量吗?,java,performance,big-o,Java,Performance,Big O,System.currentTimeMillis()是Java中时间性能的最佳度量吗?当使用此项来比较采取行动前的时间和采取行动后的时间时,是否存在任何问题?有更好的选择吗?我希望没有-这是我不使用时使用的。在Java 1.5之前,只有System.currentTimeMillis。但是,值的粒度取决于底层操作系统,可能很大。在Windows XP上,我有时会出现20毫秒的间隔。我听说Linux在1-2ms的范围内有更好的性能 使用Java 1.5,您还可以使用System.nanoTime。

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

我希望没有-这是我不使用时使用的。

在Java 1.5之前,只有System.currentTimeMillis。但是,值的粒度取决于底层操作系统,可能很大。在Windows XP上,我有时会出现20毫秒的间隔。我听说Linux在1-2ms的范围内有更好的性能


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

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


有一个有趣的问题解决方案。

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

java.lang.management.ManagementFactory.getThreadMXBean()

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

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

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


*Windows“与internet时间同步”进行逐步更改。这可能会造成很大的破坏性,与通过调整客户端时基频率来“跟踪”服务器的正确NTP客户端实现相反

您可以使用它,这使得测量时间变得非常简单。

对于
nanoTime
来说,(在Windows w.Sun JDK6上,在任何情况下)一个问题是返回的值取决于执行线程的CPU核心。如果线程开始在一个核心上执行,然后在另一个核心上完成,那么您的数字将有点偏离。我的代码类似于
longstart=System.nanoTime();doIt();long elapsednos=System.nanoime()-start
并以
elapsednos
为负结束。如果在开始和结束时间之间线程被挂起,那么结束时间实际上也会反映挂起时间。因此,end start将不是线程在执行过程中花费的实际时间。由于引用的链接不再可用,因此被否决。请引用相关信息。为什么guava秒表优于System.currentTimeMillis()?最近的
nanoTime
的“周期性数字溢出”将发生
2262-04-11 23:47:16 UTC+0