【发布时间】:2019-11-19 00:02:25
【问题描述】:
在我的代码中,DAO 从很多地方进行数据库调用。我想知道哪种方法比较好。
我可以在调用之前将带有当前时间戳的日志放在第一个,在调用完成后第二个获取它的差异,但是通过这种方式,我必须在所有地方进行更改。
【问题讨论】:
标签: scala playframework performance-testing
在我的代码中,DAO 从很多地方进行数据库调用。我想知道哪种方法比较好。
我可以在调用之前将带有当前时间戳的日志放在第一个,在调用完成后第二个获取它的差异,但是通过这种方式,我必须在所有地方进行更改。
【问题讨论】:
标签: scala playframework performance-testing
你可以只引入代码块包装器,它会测量经过的时间:
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
}
【讨论】:
body 启动异步任务时不会出现这种情况,例如R = Future[_]。这将仅测量Future 启动时间。例如。 def measure(db run query.result)