2014-07-07 5 views
5

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?

Antwort

1

Sie können die ThreadMXBean verwenden, um die akkumulierte Zeit zu erhalten, die der aktuelle Thread für die CPU ausgegeben hat, genau wie currentTimeMillis (eher wie Nanos), aber für die CPU-Planung. Es ist nicht garantiert, dass es auf allen JVMs vorhanden ist, aber die meisten Standardimplementierungen haben Zugriff darauf (ich denke, es wird geworfen, wenn es nicht verfügbar ist).

import java.lang.management.ManagementFactory 

    def runAndTime(f: => Unit) = { 
    val start = ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime 
    f 
    ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime - start 
    } 
Verwandte Themen