Можно ли сделать таймеры объема в Scala? - PullRequest
2 голосов
/ 17 февраля 2012

Я пытаюсь сделать таймер, который измеряет время выполнения области.Я мог бы сделать это, запустив таймер вручную, а затем поместив что-то в конец области видимости, чтобы остановить таймер, но это вдвое больше работы.В 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?

1 Ответ

11 голосов
/ 17 февраля 2012

Примерно так:

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
...