2012-02-17 51 views
2

我想製作一個計時器來測量範圍的執行時間。我可以通過手動啓動計時器來完成此任務,然後在範圍的末尾放置一些東西來停止計時器,但這是兩倍的工作量。在C++中,你可以創建一個計時器類來評估何時調用其析構函數,並且當某些事情超出範圍時調用析構函數,所以定時器會自動「自動」處理它。在Scala是一種託管語言的情況下,一個實例在被垃圾回收之前不會消失,所以依靠這種方法在定時器方面基本上是無用的,除非我試圖計算一段時間之前的時間,直到垃圾收集爲止。可以在斯卡拉範圍定時器嗎?

這裏是什麼使一個計時器代碼看起來一樣,如果它在它離開範圍時自動計算的例子:

def someMethod(someVar: Int) { 
    val myTimer: ScopeTimer = ScopeTimer(startImmediately = true) 

    // Do some stuff 

    // Do more stuff 

    10 // Return some int value here 
} 

由於該方法返回10myTimer會離開範圍,火。

是否有任何簡單的方法讓計時器在Scala中評估這樣的作用域的執行時間?

回答

11

怎麼是這樣的:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

def timedScope(op: => Unit): Long = { 
    val start = System.nanoTime 
    op 
    System.nanoTime - start 
} 
^D 
// Exiting paste mode, now interpreting. 

timedScope: (op: => Unit)Long 

scala> timedScope { Thread.sleep(5000) } 
res2: Long = 5010040127 

scala> 

參數「OP」被作爲一個通過名字參數傳遞timedScope所以它不會計算,直到它被timedScope的身體內部使用。

並回答有關從對象調用你的後續問題,它工作得很好:

scala> object Bar { def doBar = { timedScope { Thread.sleep(5000) } } } 
defined module Bar 

scala> Bar.doBar 
res18: Long = 5010033226 
+0

這聽起來像它會在某些情況下工作,但我不知道它會靜態對象內工作。 – 2012-02-17 01:01:46

+0

它在對象內部工作得很好,請參閱上面的修改答案。 – 2012-02-17 01:16:48

+0

是的,這確實有效。我在想,如果我創建計時器並將其作爲對象的成員,我不會知道對象的實例什麼時候超出範圍,但它可以用於類。但是,是的,你的方法適用於一個函數,無論如何這是原始問題。謝謝! – 2012-02-17 01:42:47