Вы можете просто ввести обертку блока кода, которая будет измерять прошедшее время:
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
.
Как заметил Андрей, он не будет работать для функций, возвращающих какой-либо асинхронный эффект, например 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
}