2014-07-07 27 views
5

Aynı anda birden fazla vadeli çalışan bir scala kodum var. Her birini yürütmek için harcanan zamanı profillemek istiyorum. runAndTime bir naif uygulama olabilirScala'da geleceğe harcanan zaman nasıl bulunur?

for (i <- 1 to 100) { 
    val f = future { runAndTime(doSomething()) } 
    f.onComplete { 
     case Success(timeTaken) => println(timeTaken) 
     case Failure(t) => println(t.getMessage()) 
    } 
} 

: Örneğin

def runAndTime(func: => Unit) = { 
    var time = System.currentTimeMillis() 
    func 
    System.currentTimeMillis() - time 
    } 

sorun bu runAndTime ile iplik olduğunda bunun fonk ortasında ise eg (yürütme değil yani cpu dequeued ve başka bir iş parçacığı çalışmaya başladı. sistem hala geçen zaman, bu yüzden biz o iş parçacığı için harcanan zaman almaz ama iş parçacığı başlangıç ​​ve iş parçacığı arasındaki genel zaman farkı.

runAndTime'u nasıl yazabilirim, bu da geleceğin gerçekten CPU'da çalıştığı zamanı sayar?

cevap

1

ThreadMXBeanThreadMXBean, geçerli iş parçacığının CPU üzerinde harcadığı birikmiş zamanı elde etmek için currentTimeMillis (nano gibi) kullanabilir, ancak cpu zamanlaması için hesap yapabilir. Tüm JVM'lerde olması garanti edilemez, ancak çoğu standart uygulamanın buna erişimi vardır (bence mevcut değilse atıyor).

import java.lang.management.ManagementFactory 

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