【问题标题】:Can scope timers be made in Scala?可以在 Scala 中制作范围计时器吗?
【发布时间】:2012-02-17 00:31:26
【问题描述】:

我正在尝试制作一个计时器来测量范围的执行时间。我可以通过手动启动计时器来做到这一点,然后在作用域的末尾放置一些东西来停止计时器,但这是工作量的两倍。在 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 中,是否有任何简单的方法可以制作计时器来评估这样的范围的执行时间?

【问题讨论】:

    标签: scala timer scope


    【解决方案1】:

    这样的事情怎么样:

    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
    

    【讨论】:

    • 这听起来像是在某些情况下可以工作,但我不确定它是否可以在静态对象中工作。
    • 它在对象内工作得很好,请参阅上面的修改答案。
    • 是的,确实有效。我在想,如果我创建计时器并将其作为对象的成员,我将不知道该对象的实例何时超出范围,但它适用于一个类。但是,是的,您的方法适用于一个函数,无论如何这是最初的问题。谢谢!
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多