Как можно настроить цепочку скаляметров

#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 , который делегирует существующую реализацию, а затем возвращается к сборщику. Вы могли бы добавить его, используя неявное if MeasureBuilder — это сторонний тип

Ответ №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] в вашем примере.