PonyBench provides a microbenchmarking framework. It is designed to measure the runtime of synchronous and asynchronous operations.
The following is a complete program with multiple trivial benchmarks followed by their output.
use "time" actor Main is BenchmarkList new create(env: Env) => PonyBench(env, this) fun tag benchmarks(bench: PonyBench) => bench(_Nothing) bench(_Fib(5)) bench(_Fib(10)) bench(_Fib(20)) bench(_Timer(10_000)) class iso _Nothing is MicroBenchmark // Benchmark absolutely nothing. fun name(): String => "Nothing" fun apply() => // prevent compiler from optimizing out this operation DoNotOptimise[None](None) DoNotOptimise.observe() class iso _Fib is MicroBenchmark // Benchmark non-tail-recursive fibonacci let _n: U64 new iso create(n: U64) => _n = n fun name(): String => "_Fib(" + _n.string() + ")" fun apply() => DoNotOptimise[U64](_fib(_n)) DoNotOptimise.observe() fun _fib(n: U64): U64 => if n < 2 then 1 else _fib(n - 1) + _fib(n - 2) end class iso _Timer is AsyncMicroBenchmark // Asynchronous benchmark of timer. let _ts: Timers = Timers let _ns: U64 new iso create(ns: U64) => _ns = ns fun name(): String => "_Timer (" + _ns.string() + " ns)" fun apply(c: AsyncBenchContinue) => _ts(Timer( object iso is TimerNotify fun apply(timer: Timer, count: U64 = 0): Bool => // signal completion of async benchmark iteration when timer fires c.complete() false end, _ns))
By default, the results are printed to stdout like so:
Benchmark results will have their mean and median adjusted for overhead. You may disable this with --noadjust. Benchmark mean median deviation iterations Nothing 1 ns 1 ns ±0.87% 3000000 _Fib(5) 12 ns 12 ns ±1.02% 2000000 _Fib(10) 185 ns 184 ns ±1.03% 1000000 _Fib(20) 23943 ns 23898 ns ±1.11% 10000 _Timer (10000ns) 10360 ns 10238 ns ±3.25% 10000
The --noadjust
option outputs results of the overhead measured prior to each benchmark run followed by the unadjusted benchmark result. An example of the output of this program with --noadjust
is as follows:
Benchmark mean median deviation iterations Benchmark Overhead 604 ns 603 ns ±0.58% 300000 Nothing 553 ns 553 ns ±0.30% 300000 Benchmark Overhead 555 ns 555 ns ±0.51% 300000 _Fib(5) 574 ns 574 ns ±0.43% 300000 Benchmark Overhead 554 ns 556 ns ±0.48% 300000 _Fib(10) 822 ns 821 ns ±0.39% 200000 Benchmark Overhead 554 ns 553 ns ±0.65% 300000 _Fib(20) 30470 ns 30304 ns ±1.55% 5000 Benchmark Overhead 552 ns 552 ns ±0.39% 300000 _Timer (10000 ns) 10780 ns 10800 ns ±3.60% 10000
It is recommended that a PonyBench program is compiled with the --runtimebc
option, if possible, and run with the --ponynoyield
option.
© 2016-2018, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/ponybench--index