我有一个scala代码一次运行多个期货。我想分析执行每个时间所花费的时间。 例如:
for (i <- 1 to 100) {
val f = future { runAndTime(doSomething()) }
f.onComplete {
case Success(timeTaken) => println(timeTaken)
case Failure(t) => println(t.getMessage())
}
}
runAndTime
的简单实现可能是:
def runAndTime(func: => Unit) = {
var time = System.currentTimeMillis()
func
System.currentTimeMillis() - time
}
这个runAndTime
的问题在于,当线程没有执行时(例如,如果在func的中间它从cpu中出队而其他一些线程开始运行)系统仍在流逝,所以我们没有花时间在那个特定的线程上,而是在线程启动和线程结束之间的时间差。
如何编写runAndTime
来计算未来在CPU中实际执行的时间?
答案 0 :(得分:1)
您可以使用ThreadMXBean
来获取当前线程在CPU上花费的累计时间,就像currentTimeMillis
(更像是nanos)但考虑到cpu调度。它不能保证在所有JVM上,但大多数标准实现都可以访问它(我认为如果不可用则会抛出)。
import java.lang.management.ManagementFactory
def runAndTime(f: => Unit) = {
val start = ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime
f
ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime - start
}