Define and run benchmarks that objectively measure a function's evaluation time.
The general idea is to run the benchmark suite once per release. Any performance improvement/regression is objectively measured and included in the changelog/release notes.
The Criterium library does all the actual performance measurements.
See fastester.display
for utilities that generate an html document with
charts and tables that communicate those results.
Define and run benchmarks that objectively measure a function's evaluation time. The general idea is to run the benchmark suite once per release. Any performance improvement/regression is objectively measured and included in the changelog/release notes. The [Criterium](https://github.com/hugoduncan/criterium/) library does all the actual performance measurements. See [[fastester.display]] for utilities that generate an html document with charts and tables that communicate those results.
Criterium options with extremely minimal samples, etc. Use only for quick, proof-of-concept runs.
Example:
(criterium.core/benchmark (+ 1 2) *lightning-benchmark-opts*)
See also
criterium.core/*default-benchmark-opts*
and
criterium.core/*default-quick-bench-opts*
.
Criterium options with extremely minimal samples, etc. Use only for quick, proof-of-concept runs. Example: ```clojure (criterium.core/benchmark (+ 1 2) *lightning-benchmark-opts*) ``` See also [`criterium.core/*default-benchmark-opts*`](https://github.com/hugoduncan/criterium/blob/bb10582ded6de31b4b985dc31d501db604c0e461/src/criterium/core.clj#L83) and [`criterium.core/*default-quick-bench-opts*`](https://github.com/hugoduncan/criterium/blob/bb10582ded6de31b4b985dc31d501db604c0e461/src/criterium/core.clj#L92).
(range-pow-10 i)
Given integer i
, returns a sequence of [10^0...10^i]
, inclusive. Useful
for supplying to benchmarking functions.
Examples:
(range-pow-10 3) ;; => (1 10 100 1000)
(range-pow-10 6) ;; => (1 10 100 1000 10000 100000 1000000)
See also range-pow-2
.
Given integer `i`, returns a sequence of `[10^0...10^i]`, inclusive. Useful for supplying to benchmarking functions. Examples: ```clojure (range-pow-10 3) ;; => (1 10 100 1000) (range-pow-10 6) ;; => (1 10 100 1000 10000 100000 1000000) ``` See also [[range-pow-2]].
(range-pow-2 i)
Given integer i
, returns a sequence of [2^0...2^i]
, inclusive. Useful
for supplying to benchmarking functions.
Example:
(range-pow-2 8) ;; (1 2 4 8 16 32 64 128 256)
See also range-pow-10
.
Given integer `i`, returns a sequence of `[2^0...2^i]`, inclusive. Useful for supplying to benchmarking functions. Example: ```clojure (range-pow-2 8) ;; (1 2 4 8 16 32 64 128 256) ``` See also [[range-pow-10]].
(run-benchmarks)
(run-benchmarks explicit-options-filename)
Execute benchmarks associated to option key :benchmarks
, saving results to
a version-specific directory. If explicit-options-filename
is not supplied,
defaults to ./resources/fastester_options.edn
.
Upon invocation, reads options file and any benchmarks definition namespace files from the disk. Ensure that the state of the file on disk and that same file opened in a REPL-attached editor is what you intend.
If option :parallel?
is true
, runs tests in parallel. Warning: Running
tests in parallel results in inconsistent time measurements. Use
:parallel? true
only for sanity-checking the return values of (f n)
, not
for final performance measurements.
Execute benchmarks associated to option key `:benchmarks`, saving results to a version-specific directory. If `explicit-options-filename` is not supplied, defaults to `./resources/fastester_options.edn`. Upon invocation, reads options file and any benchmarks definition namespace files from the disk. Ensure that the state of the file on disk and that same file opened in a REPL-attached editor is what you intend. If option `:parallel?` is `true`, runs tests in parallel. Warning: Running tests in parallel results in inconsistent time measurements. Use `:parallel? true` only for sanity-checking the return values of `(f n)`, not for final performance measurements.
(run-manual-benchmark fexpr arg thoroughness)
Given 1-arity S-expression fexpr
representing a function and one argument
arg
, run one benchmark test using keyword thoroughness
to designate the
Criterium options, sending result to *out
*.
thoroughness
is one of :default
, :quick
, or :lightning
.
Example:
(run-manual-benchmark (fn [n] (+ n n)) 9 :lightning)
See run-one-defined-benchmark
and *lightning-benchmark-opts*
.
Given 1-arity S-expression `fexpr` representing a function and one argument `arg`, run one benchmark test using keyword `thoroughness` to designate the Criterium options, sending result to *`out`*. `thoroughness` is one of `:default`, `:quick`, or `:lightning`. Example: ```clojure (run-manual-benchmark (fn [n] (+ n n)) 9 :lightning) ``` See [[run-one-defined-benchmark]] and [[*lightning-benchmark-opts*]].
(run-one-defined-benchmark benchmark thoroughness)
Given defined benchmark
, an unquoted symbol, and keyword thoroughness
that designates the Criterium options, runs a benchmark for each defined
argument. Returns a hashmap whose keys are arguments n
, associated to values
that are the benchmark results for that n
.
thoroughness
is one of :default
, :quick
, or :lightning
.
Example:
;; define a benchmark
(defbench my-bench "my-group" (fn [x] (inc x)) [97 98 99])
(run-one-defined-benchmark my-bench :lightning)
;; => {97 {:mean ... :var ...}
;; 98 {:mean ... :var ...}
;; 99 {:mean ... :var ...}}
The above example returns a hashmap with three key+vals: keys 97
, 98
, and
99
, each associated with its respective benchmark result.
See also run-manual-benchmark
and *lightning-benchmark-opts*
.
Given defined `benchmark`, an unquoted symbol, and keyword `thoroughness` that designates the Criterium options, runs a benchmark for each defined argument. Returns a hashmap whose keys are arguments `n`, associated to values that are the benchmark results for that `n`. `thoroughness` is one of `:default`, `:quick`, or `:lightning`. Example: ```clojure ;; define a benchmark (defbench my-bench "my-group" (fn [x] (inc x)) [97 98 99]) (run-one-defined-benchmark my-bench :lightning) ;; => {97 {:mean ... :var ...} ;; 98 {:mean ... :var ...} ;; 99 {:mean ... :var ...}} ``` The above example returns a hashmap with three key+vals: keys `97`, `98`, and `99`, each associated with its respective benchmark result. See also [[run-manual-benchmark]] and [[*lightning-benchmark-opts*]].
(run-save-benchmark ver name namespace group f fexpr arg idx opts)
Given string ver
, symbol name
, namespace namespace
, string group
,
function object f
, function S-expression fexpr
, test argument arg
,
index integer idx
, and option hashmap opts
, measures the evaluation time
according to the option's :testing-thoroughness
for Criterium benchmark
settings and saves results to file system.
Example:
(run-save-benchmark "77-SNAPSHOT7"
'mult-two-nums
'benchmark-namespace
"adding --- stuff"
(fn [n] (* n n))
'(fn [n] (* n n))
22
5
options)
See also run-manual-benchmark
and run-one-defined-benchmark
for
utilities to quickly benchmark an expression.
Given string `ver`, symbol `name`, namespace `namespace`, string `group`, function object `f`, function S-expression `fexpr`, test argument `arg`, index integer `idx`, and option hashmap `opts`, measures the evaluation time according to the option's `:testing-thoroughness` for Criterium benchmark settings and saves results to file system. Example: ```clojure (run-save-benchmark "77-SNAPSHOT7" 'mult-two-nums 'benchmark-namespace "adding --- stuff" (fn [n] (* n n)) '(fn [n] (* n n)) 22 5 options) ``` See also [[run-manual-benchmark]] and [[run-one-defined-benchmark]] for utilities to quickly benchmark an expression.
cljdoc builds & hosts documentation for Clojure/Script libraries
Ctrl+k | Jump to recent docs |
← | Move to previous article |
→ | Move to next article |
Ctrl+/ | Jump to the search field |