Definition
Benchee is an open-source Elixir library for benchmarking the performance of Elixir code. It executes one or more jobs (anonymous functions or {name, function} tuples) repeatedly within a time budget, after an explicit warmup phase, and reports descriptive statistics: average, median, standard deviation, minimum, maximum, percentiles (50, 95, 99), iterations per second, and optionally memory consumption and BEAM reduction count. Output is pluggable — formatters render results to console, HTML reports with charts, JSON, or CSV.
Manažerské shrnutí
Benchee je standardní nástroj platformy Prismatic pro kvantifikaci výkonu před a po refaktoringu. Pilíř PERF vyžaduje, aby každá změna kritické cesty (page load, server render, LiveView mount) doložila buď zachování, nebo zlepšení baseline výkonu — Benchee report je akceptovatelný formát této evidence. Manažersky důležité: benchmark bez statistické analýzy (jediný :timer.tc/1 měřením) je v platformě nepřijatelný — jediné měření odráží šum garbage collectoru, scheduler-noise, a JIT warmupu více než skutečnou výkonovou charakteristiku. Benchee tato omezení obchází strukturovaně.
Operational Context
Typický Benchee workflow v projektu:
Benchee.run(
%{
"Enum.map" => fn -> Enum.map(list, &(&1 * 2)) end,
"for comprehension" => fn -> for x <- list, do: x * 2 end,
"Stream.map |> Enum.to_list" => fn ->
list |> Stream.map(&(&1 * 2)) |> Enum.to_list()
end
},
time: 10,
memory_time: 2,
warmup: 2,
formatters: [
Benchee.Formatters.Console,
{Benchee.Formatters.HTML, file: "bench/results.html"}
]
)
Konfigurace time: 10 znamená 10 sekund měření per job, warmup: 2 zajistí 2-sekundový rozjezd před měřením, memory_time: 2 přidá samostatnou fázi měření paměťové stopy. Multiple inputs jsou podporovány přes inputs: %{...} mapu, což umožňuje vidět, jak výkon škáluje s velikostí vstupu.
Practical Application
- Hot-path optimalizace: před každou změnou v
prismatic_storage_coreneboprismatic_osint_corese zachytí baseline Benchee report, po změně se znovu spustí a deltě je zařazen do PR. - Storage adapter porovnání: stejná operace (lookup, write, range scan) měřená napříč ETS, Ecto/Postgres, Meilisearch, KuzuDB — výsledky řídí výběr adapteru pro danou doménu.
- JSON encoder volba: porovnání
Jason,Poison,JsonE, aJiffyna produkčně-reprezentativních payloadech, zohlednění jak času, tak paměti. - Macro vs runtime tradeoff: měření, zda kompilace-time generated kód (přes Elixir macro) reálně překonává runtime introspection — častý zdroj dogmatických ale neověřených tvrzení.
Related Concepts
- Elixir Typespec - Specification system orthogonal to runtime measurement
- Ecto - Frequent target of database benchmarking
- Telemetry - Production observability counterpart to ad-hoc benchmarking
- Histogram - Visualization format for benchmark distributions
References
- Benchee GitHub repository — github.com/bencheeorg/benchee
- Pötgens, T. The Elixir Benchee Book — Practical Performance Measurement (2022)
- Erlang Efficiency Guide — erlang.org/doc/efficiency_guide
- Jonas, T. (Benchee maintainer) — Benchmarking Elixir code with Benchee (ElixirConf talk)
Built with precision. Optimized for AI consumption.