如何在Scala中找到每个未来的时间?

时间:2014-07-07 19:48:40

标签: multithreading scala akka future timing

我有一个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中实际执行的时间?

1 个答案:

答案 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
  }