Как сделать Microbenchmark, используя данные из файла? - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь провести микробенчмаркинг двух разных реализаций вычисления текущей медианы с использованием 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
}

1 Ответ

0 голосов
/ 12 декабря 2018

ОП здесь: через несколько часов я наконец-то смог просмотреть патетически устаревшую документацию, которая существует в любом случае, и выяснить следующее:

В дополнение к моему редактированию выше, есть несколько способовпереопределить счетчик выполнения et.al.

  1. Для всех эталонных тестов в текущем файле используйте override def defaultConfig: Context = Context(exec.benchRuns -> 10)
  2. . Для конкретного эталонного теста определите inline или определите val opts: Context и используйте config opts in DSL.
  3. Для конкретного метода сделайте то же самое, что и # 2, за исключением использования config opts in в методе DSL.
  4. В документации утверждается, что можно переопределить конфигурации для каждой "кривой", но я не смогчтобы найти, что такое «кривая» или как переопределить конфигурации для нее.

independentSamples = количество независимых JVM, созданных.

Прогон запускается (minWarmupRuns to maxWarmupRuns) раз на каждой JVM (имеет смысл), используя один набор тестовых данных (выбранных случайным образом?), затем тесты запускаются на каждой JVM benchRuns раз.Сколько прогревов выполняется, зависит от обнаружения «устойчивого состояния».Кажется, что в конце для каждой виртуальной машины Java не учтено одно выполнение.

Total number of executions = independentSamples * ((minWarmupRuns to maxWarmupRuns) + benchRuns + 1)

Например, с учетом:

Context(
  exec.minWarmupRuns -> 5,
  exec.maxWarmupRuns -> 5,
  exec.benchRuns -> 10,
  exec.independentSamples -> 2
)

Будет 32 выполнения тестируемого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...