Benchee

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

  1. Hot-path optimalizace: před každou změnou v prismatic_storage_core nebo prismatic_osint_core se zachytí baseline Benchee report, po změně se znovu spustí a deltě je zařazen do PR.
  2. 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.
  3. JSON encoder volba: porovnání Jason, Poison, JsonE, a Jiffy na produkčně-reprezentativních payloadech, zohlednění jak času, tak paměti.
  4. 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í.
  • 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.