在我的代码中,DAO在很多地方都在进行数据库调用。我想知道哪种方法可以做到这一点。
我可以在调用之前将带有当前时间戳的日志放在第一行,而在调用完成之后将其放在第二时间戳,但是通过这种方式,我必须在整个地方进行更改。
答案 0 :(得分:4)
您只需引入代码块包装器即可测量经过时间:
def measure[R](body: => R): R = {
val start = System.currentTimeMillis()
val result = body
val end = System.currentTimeMillis()
println(s"Task took: ${end - start} ms.") // replace with proper logging
result
}
然后您可以像这样使用它:
def doStuff() = measure {
doJdbcCall();
val result = doSomethingElse();
result
}
或
val result = measure(doJdbcCall)
您仍然必须修改代码库,但是所有计算时差的逻辑都将隐藏在measure
方法下。
正如Andrij所注意到的,它不适用于返回任何异步效果的函数,例如Future
,但是我们可以准备重载方法来处理标准库Future
:
def measure[R](f: Future[R]): Future[R] = {
val start = System.currentTimeMillis()
f.onComplete{
case _ =>
val end = System.currentTimeMillis()
println(s"Task took: ${end - start} ms.") // replace with proper logging
}
f
}