我正在尝试制作一个计时器来测量作用域的执行时间。我可以通过手动启动计时器,然后在示波器的末尾放置一些内容来停止计时器来完成此操作,但这是工作量的两倍。在C ++中,您可以创建一个计时器类,该计时器类计算何时调用其析构函数,并在超出范围时调用析构函数,因此计时器可以“自动”处理自身。由于Scala是一种托管语言,因此一个实例直到被垃圾回收后才会消失,因此就计时器而言,依赖于该方法实际上是没有用的,除非我试图计时直到垃圾被回收之前该对象的生存时间。

这是一个示例,说明在离开范围时自动评估计时器的代码是什么样的:

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

  // Do some stuff

  // Do more stuff

  10   // Return some int value here
}


当方法返回10时,myTimer将离开作用域并触发。

在Scala中,是否有任何简单的方法可以使计时器来评估像这样的作用域的执行时间?

最佳答案

这样的事情怎么样:

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

关于scala - 可以在Scala中创建范围计时器吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9321269/

10-15 02:37