Я пытаюсь провести микробенчмаркинг двух разных реализаций вычисления текущей медианы с использованием Scalameter .У меня есть несколько тестовых файлов, маленьких и больших, откуда будут взяты цифры.Проблема в том, что следующий код завершается мгновенно, не генерируя никаких тестов вообще.
object MedianMaintenanceBenchmark extends Bench[Double] {
/* configuration */
lazy val executor = LocalExecutor(
new Warmer.Default,
Aggregator.median[Double],
measurer
)
lazy val measurer = new Measurer.Default
lazy val reporter = new LoggingReporter[Double]
lazy val persistor: Persistor.None.type = Persistor.None
/* inputs */
private val files: Gen[String] = Gen.enumeration("files")("median-test")
private val num: Gen[Seq[Int]] = (for (f <- files) yield numbers(f)).cached
/* tests */
performance of "MedianMaintenance" config (
exec.benchRuns -> 10
) in {
measure method "using heap" in {
using(num) in {
xs => MedianMaintenanceUsingHeaps(xs).medians
}
}
}
private def numbers(filename: String): Seq[Int] = // elided
}
Вывод:
::Benchmark MedianMaintenance.using heap::
cores: 8
hostname: ***
name: OpenJDK 64-Bit Server VM
osArch: x86_64
osName: Mac OS X
vendor: Azul Systems, Inc.
version: 11.0.1+13-LTS
Parameters(files -> median-test): 3.612799 ms
Что здесь происходит?
Редактировать:
Изменение кода следующим образом, по крайней мере, что-то делает, но не учитывает параметры.Похоже, что в общей сложности 18 раз выполнялся тест для файла «Медиана», что не является суммой 3 + 10.
object MedianMaintenanceBenchmark extends Bench.ForkedTime {
/* configuration */
override def aggregator: Aggregator[Double] = Aggregator.median
private val opts = Context(
exec.minWarmupRuns-> 3,
exec.maxWarmupRuns -> 3,
exec.benchRuns -> 10,
exec.jvmflags -> List("-Xms2g", "-Xmx2g")
)
/* inputs */
private val files: Gen[String] = Gen.enumeration("files")("median-test", "Median")
private val num: Gen[Seq[Int]] = (for (f <- files) yield numbers(f)).cached
/* tests */
performance of "MedianMaintenance" config opts in {
measure method "using heap" in {
using(num) in {
xs => MedianMaintenanceUsingHeaps(xs).medians
}
}
measure method "using red-black BST" in {
using(num) in {
xs => MedianMaintenanceUsingRedBlackTree(xs).medians
}
}
}
private def numbers(filename: String): Seq[Int] = // elided
}