这种方法的一个缺陷是,执行所需的“真实”时间可能会有很大差异,具体取决于系统上运行的其他程序及其负载。这使得性能测量有些不精确。doSomething()
假设代码是单线程的,则跟踪执行代码所需时间的一种更准确的方法是查看线程在调用期间消耗的 CPU 时间。您可以使用JMX类执行此操作;特别是ThreadMXBean
。您可以从 java.lang.management.ManagementFactory
检索 的实例,如果您的平台支持(大多数平台都支持),请使用 getCurrentThreadCpuTime
方法来代替 执行类似的测试。请记住,报告时间以纳秒为单位,而不是以毫秒为单位。ThreadMXBean
System.currentTimeMillis
getCurrentThreadCpuTime
下面是一个可用于执行测量的示例(Scala)方法:
def measureCpuTime(f: => Unit): java.time.Duration = {
import java.lang.management.ManagementFactory.getThreadMXBean
if (!getThreadMXBean.isThreadCpuTimeSupported)
throw new UnsupportedOperationException(
"JVM does not support measuring thread CPU-time")
var finalCpuTime: Option[Long] = None
val thread = new Thread {
override def run(): Unit = {
f
finalCpuTime = Some(getThreadMXBean.getThreadCpuTime(
Thread.currentThread.getId))
}
}
thread.start()
while (finalCpuTime.isEmpty && thread.isAlive) {
Thread.sleep(100)
}
java.time.Duration.ofNanos(finalCpuTime.getOrElse {
throw new Exception("Operation never returned, and the thread is dead " +
"(perhaps an unhandled exception occurred)")
})
}
(随意将上述内容翻译成Java!
这种策略并不完美,但它受系统负载变化的影响较小。