2012-02-17 41 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