У вас есть пара «запахов кода», которые предполагают, что лучший, более блестящий дизайн, вероятно, уже не за горами:
- Вы используете изменяемую переменную, var вместо val
- время работает исключительно за счет побочных эффектов, оно изменяет состояние вне функции, и последующие вызовы с одним и тем же входом могут иметь разные результаты.
seq
немного рискованно как имя переменной, оно слишком близко к (очень распространенному и популярному) типу Seq
из стандартной библиотеки.
Итак, возвращаясь к первым принципам, как еще можно достичь тех же результатов в более «идиоматическом» стиле? Начиная с оригинального дизайна (насколько я понимаю):
- первый звонок
timeit(seq,comment)
просто отмечает текущее время
- последующие вызовы с тем же значением
seq
вывести время, прошедшее с момента предыдущего вызова
По сути, вы просто хотите узнать, сколько времени занимает выполнение блока кода. Если был способ передать «блок кода» в функцию, то, может быть, просто может быть… К счастью, Scala может сделать это, просто используя параметр по имени:
def timeit(block: => Unit) : Long = {
val start = System.currentTimeMillis
block
System.currentTimeMillis - start
}
Просто проверьте этот параметр block
, он немного похож на функцию без аргументов, вот как записываются параметры по имени. Последнее выражение функции System.currentTimeMillis - start
используется в качестве возвращаемого значения.
Оборачивая список параметров в скобки {} вместо скобок (), вы можете сделать его похожим на встроенную структуру управления и использовать его следующим образом:
val duration = timeit {
do stuff here
more stuff
do other stuff
}
println("setup time:" + duration + "ms")
В качестве альтернативы, вы можете вернуть поведение println обратно в функцию timeit, но это усложнит жизнь, если позже вы захотите использовать его для синхронизации чего-либо, не выводя его на консоль:
def timeit(description: String)(block: => Unit) : Unit = {
val start = System.currentTimeMillis
block
val duration System.currentTimeMillis - start
println(description + " took " + duration + "ms")
}
Это еще одна хитрость, блоки с несколькими параметрами. Это позволяет использовать круглые скобки для первого блока и фигурные скобки для второго:
timeit("setup") {
do stuff here
more stuff
do other stuff
}
// will print "setup took XXXms"
Конечно, есть миллион других вариантов, которые вы можете сделать по этому шаблону, с различной степенью сложности / сложности, но этого должно быть достаточно, чтобы вы начали ...