System.currentTimeMillis()在Java中是否是测量时间性能的最佳方法?使用它来比较操作前后所花费的时间时,是否存在任何问题?是否有更好的替代方案?
System.currentTimeMillis()在Java中是否是测量时间性能的最佳方法?使用它来比较操作前后所花费的时间时,是否存在任何问题?是否有更好的替代方案?
我希望不需要这样做- 当我不使用 nanoTime()
时,这是我的选择。
nanoTime
存在一个需要注意的问题,即返回值取决于执行线程的CPU核心。如果线程在一个核心上开始执行,并在另一个核心上完成执行,则计算出的时间将有些偏差。例如,当我使用类似于long start = System.nanoTime(); doIt(); long elapsedNanos = System.nanoTime() - start;
的代码时,最终得到的elapsedNanos
值为负数。 - gustafc除了System.nanoTime()
之外,JMX可能是最好的可行选项:
java.lang.management.ManagementFactory.getThreadMXBean()
您可以查询当前线程的CPU时间(以纳秒为单位进行测量,但不具有纳秒精度,就像System.nanoTime
一样)。
nanoTime
的最近的“周期性数字溢出”将在 2262-04-11 23:47:16 UTC+0
发生。 - Yahor在Java 1.5之前,只有System.currentTimeMillis。然而,该值的粒度取决于底层操作系统,可能很大。在Windows XP上,我有时会出现20毫秒的间隙。我听说Linux在1-2毫秒的范围内更好。
使用Java 1.5,您还可以使用System.nanoTime。我从来没有遇到过这个问题。