ScalaMeter如何链配置

How can ScalaMeter chain configuration

我很困惑 ScalaMeter 怎么能像这样链式配置

val standardConfig = config(
  Key.exec.minWarmupRuns -> 5,
  Key.exec.maxWarmupRuns -> 10,
  Key.exec.benchRuns -> 10,
  Key.verbose -> true
) withWarmer(new Warmer.Default)

第一个config(...)表达式returns MeasureBuilder[T, U]类型,这个我懂了。

但是,我们如何链接第二个表达式 withWarmer(new Warmer.Default),它也是 returns MeasureBuilder 类型。

起初,我猜 MeasureBuilder 类型实现允许我们这样做的 apply 方法,但在测量一段代码的性能之前的最后一步,我们需要

val partime = standardConfig measure {
  ...
}

其中 measure { ... } return Quantity[U] 类型不是 MeasureBuilder.

那么,ScalaMeter 配置如何链接这样的表达式?

请首先注意 config 方法在导入后公开:

import org.scalameter.config

这是因为它是在包级别的companion object上声明的:

package object scalameter extends MeasureBuilder[Unit, Double](

因此,当您声明 val standardConfig = config(...) 时,您会得到 MeasureBuilder[Unit, Double]

之后classMeasureBuilder暴露了一个方法withWarmer,实际调用了,returns一个MeasureBuilder[Unit, Double],既有配置又有warmer应用。

MeasureBuilder 公开了一个方法 measure:

def measure[S](b: =>S): Quantity[U] = measured(b)._2

在您的示例中 returns Quantity[Double]