示波器定时器可以用Scala制造吗?

示波器定时器可以用Scala制造吗?,scala,timer,scope,Scala,Timer,Scope,我试图制作一个计时器来测量作用域的执行时间。我可以手动启动计时器,然后在作用域的末尾放置一些东西来停止计时器,但这是工作量的两倍。在C++中,你可以创建一个计时器类来评估何时调用它的析构函数,当某个东西超出范围时调用析构函数,因此计时器自动地处理它自己。由于Scala是一种托管语言,实例在垃圾收集之前不会消失,因此依赖该方法在计时器方面基本上是无用的,除非我试图计算某个对象在垃圾收集之前的生存时间 下面是一个示例,说明了如果计时器在离开作用域时自动求值,那么用于创建计时器的代码会是什么样子: d

我试图制作一个计时器来测量作用域的执行时间。我可以手动启动计时器,然后在作用域的末尾放置一些东西来停止计时器,但这是工作量的两倍。在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

这听起来在某些情况下是可行的,但我不确定它在静态对象中是否可行。它在对象中运行得很好,请参见上面的修正答案。是的,确实有效。我在想,如果我创建了计时器并将其作为对象的一个成员,我不知道对象的实例何时超出范围,但它对类有效。但是,是的,你的方法适用于一个函数,这是最初的问题。谢谢