2014-07-07 9 views
5

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?

Odpowiedz

1

Możesz użyć ThreadMXBean, aby uzyskać skumulowany czas, jaki bieżący wątek wydał na procesor, podobnie jak currentTimeMillis (bardziej jak nanos), ale uwzględniający harmonogramowanie procesora. Nie ma gwarancji, że będzie na wszystkich maszynach JVM, ale większość standardowych implementacji ma do nich dostęp (myślę, że wyrzuci, jeśli są niedostępne).

import java.lang.management.ManagementFactory 

    def runAndTime(f: => Unit) = { 
    val start = ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime 
    f 
    ManagementFactory.getThreadMXBean.getCurrentThreadCpuTime - start 
    } 
Powiązane problemy