golden
golden copied to clipboard
a benchmark for compile-time and/or runtime Nim 🏆
golden
A benchmarking tool that measures and records runtime of any executable and also happens to know how to compile Nim.
The idea here is that we're gonna make a record of everything we run, everything we build, and be able to discover and pinpoint regressions automatically using native git-fu performed by the tool. Fire and forget!
Installation
Nimph
$ nimph clone golden
Nimble
$ nimble install golden
Usage
If you pass it a binary, it'll run it a bunch of times and report some runtime statistics periodically.
If you pass it some Nim source, it will compile it for you and report some compilation and runtime statistics periodically.
By default, it will run until you interrupt it.
$ golden --truth=0.002 bench.nim
compilations after 0s
┌────────┬──────────┬──────────┬──────────┬──────────┐
│ Builds │ Min │ Max │ Mean │ StdDev │
├────────┼──────────┼──────────┼──────────┼──────────┤
│ 1 │ 0.396129 │ 0.396129 │ 0.396129 │ 0.000000 │
└────────┴──────────┴──────────┴──────────┴──────────┘
benchmark after 1s
┌────────┬──────────┬──────────┬──────────┬──────────┐
│ Runs │ Min │ Max │ Mean │ StdDev │
├────────┼──────────┼──────────┼──────────┼──────────┤
│ 1 │ 1.959187 │ 1.959187 │ 1.959187 │ 0.000000 │
└────────┴──────────┴──────────┴──────────┴──────────┘
benchmark after 3s
┌────────┬──────────┬──────────┬──────────┬──────────┐
│ Runs │ Min │ Max │ Mean │ StdDev │
├────────┼──────────┼──────────┼──────────┼──────────┤
│ 2 │ 1.958892 │ 1.959187 │ 1.959039 │ 0.000147 │
└────────┴──────────┴──────────┴──────────┴──────────┘
completed benchmark after 5s
┌────────┬──────────┬──────────┬──────────┬──────────┐
│ Runs │ Min │ Max │ Mean │ StdDev │
├────────┼──────────┼──────────┼──────────┼──────────┤
│ 3 │ 1.958892 │ 1.961293 │ 1.959791 │ 0.001069 │
└────────┴──────────┴──────────┴──────────┴──────────┘
Benchmarking the compilation of Nim itself:
$ cd ~/git/Nim
$ golden koch -- boot -d:danger
# ...
┌────────┬──────────┬──────────┬──────────┬──────────┐
│ # │ Min │ Max │ Mean │ StdDev │
├────────┼──────────┼──────────┼──────────┼──────────┤
│ 12 │ 8.846606 │ 9.485832 │ 8.945023 │ 0.165638 │
└────────┴──────────┴──────────┴──────────┴──────────┘
Benchmarking compilation of slow-to-compile Nim:
$ golden --compilation openapi.nim
┌────────┬───────────┬───────────┬───────────┬──────────┐
│ # │ Min │ Max │ Mean │ StdDev │
├────────┼───────────┼───────────┼───────────┼──────────┤
│ 1 │ 91.946370 │ 91.946370 │ 91.946370 │ 0.000000 │
└────────┴───────────┴───────────┴───────────┴──────────┘
┌────────┬───────────┬───────────┬───────────┬───────────┐
│ # │ Min │ Max │ Mean │ StdDev │
├────────┼───────────┼───────────┼───────────┼───────────┤
│ 2 │ 29.271556 │ 91.946370 │ 60.608963 │ 31.337407 │
└────────┴───────────┴───────────┴───────────┴───────────┘
Command Line Options
trutha float percentage indicating how much jitter you'll acceptruntimea float of seconds after which we should kill each invocationiterationsa number of invocations after which we should stop the benchmarkstoragethe path to a database file you wish to use; must end in.golden-lmdbinteractive-forcedassume output friendly to humansjson-outputassume output friendly to machines (work in progress)color-forcedenable color output when not ininteractivemodeprune-outliersthrow out this percentage of aberrant invocations with long runtime in order to clean up the histogramdry-rundon't write any results to the databasehistogram-classesthe number of points in the histogramcompilation-onlybenchmark the Nim compiler on the given source(s)briefonly output the statistics at the completion of the benchmarknever-outputnever emit anything via stdout/stderrdump-outputalways print the stdout/stderr of the benchmarked program--the following arguments are passed to the compiler and runtime. Note that if you supply-- cppfor compilation via C++, you will need to supply your own defines such as-d:danger.
License
MIT