我正在尝试对使用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
}
OP在这里:几个小时后,我终于能够通过可悲过时的文档,无论如何存在,并找出以下内容:
除了我上面的编辑之外,还有几种方法可以覆盖执行计数等。阿尔。
override def defaultConfig: Context = Context(exec.benchRuns -> 10)
val opts: Context
并使用config opts in
DSL。config opts in
在方法 DSL 中使用外,执行与 #2 相同的操作。IndependentSamples = 产生的独立 JVM 的数量。
预热是(minWarmupRuns to maxWarmupRuns)
使用一组测试数据(随机选择?)在每个 JVM 上的运行时间(有意义),然后测试在每个 JVM 上运行benchRuns
多次。运行多少次预热取决于“稳态”的检测。似乎每个 JVM 最终都有一个未计算的执行。
Total number of executions = independentSamples * ((minWarmupRuns to maxWarmupRuns) + benchRuns + 1)
例如,给定:
Context(
exec.minWarmupRuns -> 5,
exec.maxWarmupRuns -> 5,
exec.benchRuns -> 10,
exec.independentSamples -> 2
)
将有 32 次执行被测代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句