#scala #scalameter
#scala #скаляметр
Вопрос:
Я довольно запутан в том, как можно настроить цепочку скаляметров таким образом
val standardConfig = config(
Key.exec.minWarmupRuns -> 5,
Key.exec.maxWarmupRuns -> 10,
Key.exec.benchRuns -> 10,
Key.verbose -> true
) withWarmer(new Warmer.Default)
Первое config(...)
выражение возвращает MeasureBuilder[T, U]
тип, это я понимаю.
Однако, как мы можем связать второе выражение withWarmer(new Warmer.Default)
, которое также возвращает MeasureBuilder
тип.
Сначала я предполагаю, что MeasureBuilder
этот тип реализует метод apply, который позволяет нам это делать, но на последнем шаге перед измерением производительности фрагмента кода, который нам нужен
val partime = standardConfig measure {
...
}
где measure { ... }
возвращаемый Quantity[U]
тип, которого нет MeasureBuilder
.
Итак, как конфигурация скаляметра может связать выражение подобным образом?
Комментарии:
1. Пробел между
config(..)
иwithWarmer
— это просто альтернативный синтаксис пунктирному, аналогичный тому, что было быconfig(..).withWarmer(..)
2. Вы должны изменить свой
measure
, чтобы он возвращал конструктор. Или, что еще лучше, создайте помощникаwithMeasure
, который делегирует существующую реализацию, а затем возвращается к сборщику. Вы могли бы добавить его, используя неявное ifMeasureBuilder
— это сторонний тип
Ответ №1:
Пожалуйста, сначала обратите внимание, что config
метод раскрывается после внедрения:
import org.scalameter.config
Это связано с тем, что он объявлен в сопутствующем объекте на уровне пакета:
package object scalameter extends MeasureBuilder[Unit, Double](
Поэтому, когда вы объявляете val standardConfig = config(...)
, вы получаете MeasureBuilder[Unit, Double]
После этого класс MeasureBuilder
предоставляет метод withWarmer
, который фактически вызывается, и возвращает a MeasureBuilder[Unit, Double]
, с применением как конфигурации, так и подогрева.
MeasureBuilder
предоставляет метод measure
:
def measure[S](b: =>S): Quantity[U] = measured(b)._2
который возвращается Quantity[Double]
в вашем примере.