Ich habe einen Scala-Code, der mehrere Futures gleichzeitig ausführt. Ich möchte die Zeit, die ich für die Ausführung von jedem von ihnen verbracht habe, profilieren. Zum Beispiel:Wie findet man die Zeit, die man pro Zukunft in Scala verbringt?
for (i <- 1 to 100) {
val f = future { runAndTime(doSomething()) }
f.onComplete {
case Success(timeTaken) => println(timeTaken)
case Failure(t) => println(t.getMessage())
}
}
Eine naive Implementierung von runAndTime
sein könnte:
def runAndTime(func: => Unit) = {
var time = System.currentTimeMillis()
func
System.currentTimeMillis() - time
}
mit diesem runAndTime
Das Problem ist, dass, wenn der Faden (für zB wenn in der Mitte nicht die Ausführung ist es von func wurde aus der CPU herausgenommen und ein anderer Thread wurde gestartet) das System läuft noch, so dass wir keine Zeit in diesem bestimmten Thread verbringen, sondern den gesamten Zeitunterschied zwischen Thread-Start und Thread-Ende.
Wie kann ich schreiben einen runAndTime
, die die Zeit der Zukunft zählen wird tatsächlich in der CPU ausgeführt wird?