首页 文章

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

提问于
浏览
5

我有一个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 的问题在于,当线程在该特定线程中花费时间但在线程启动和线程结束之间的总时间差 .

如何编写 runAndTime ,它将计算未来在CPU中实际执行的时间?

1 回答

  • 1

    您可以使用 ThreadMXBean 来获取当前线程在CPU上花费的累计时间,就像 currentTimeMillis (更像是nanos)但是考虑到cpu调度 . 它's not guaranteed to be on all JVM'但是大多数标准实现都可以访问它(我认为如果不可用它会抛出) .

    import java.lang.management.ManagementFactory
    
      def runAndTime(f: => Unit) = {
        val start = ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime
        f
        ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime - start
      }
    

相关问题