Mam kod scala z wieloma kontraktami futures na raz. Chcę profilować czas spędzony na wykonaniu każdego z nich. Na przykład:Jak znaleźć czas spędzony w przyszłości w Scali?
for (i <- 1 to 100) {
val f = future { runAndTime(doSomething()) }
f.onComplete {
case Success(timeTaken) => println(timeTaken)
case Failure(t) => println(t.getMessage())
}
}
Naiwny realizacja runAndTime
mogą być:
def runAndTime(func: => Unit) = {
var time = System.currentTimeMillis()
func
System.currentTimeMillis() - time
}
Problem z tym jest to, że nie runAndTime
gdy wątek jest wykonywanie (na przykład gdy w środku niej func został usunięty z procesora i uruchomiono jakiś inny wątek), system wciąż się zużywa, więc nie mamy czasu spędzonego w tym konkretnym wątku, ale ogólną różnicę czasu między wątkiem a końcem wątku.
Jak mogę napisać runAndTime
, który policzy czas rzeczywistej realizacji w CPU?