Skip to content

Releases: gungraun/gungraun

v0.19.2

08 Jun 16:12
bb99185

Choose a tag to compare

[0.19.2] - 2026-06-08

Changed

  • (#655,#657): Update proc-macro-error2 to proc-macro-error3 to address RUSTSEC-2026-0173 and fix the future incompatibility warning
  • Update dependencies

Full Changelog: v0.19.1...v0.19.2

v0.19.1

27 May 23:55
78a622a

Choose a tag to compare

[0.19.1] - 2026-05-27

Added

  • (#573, #643): DHAT output files are now tailored to configured entry points and additional DHAT frame filters by default. The new Dhat::sanitize_output option controls whether output files are sanitized. Optionally, keep .orig backups with SanitizeOutput::KeepOrig.
  • (#644): Honor --format terse when combined with --list so gungraun bench binaries are compatible with cargo nextest test discovery. Terse output contains only the per-benchmark lines without the trailing blank line and 0 tests, N benchmarks summary that the default libtest-pretty listing emits. The previously hidden libtest-compat --format shim now actually honors the value; any value other than terse (including pretty, json, junit, the empty string, or unknown values) falls back to the existing pretty output. --list --format terse --ignored emits empty stdout because gungraun has no ignored-benchmark concept (the contract nextest documents for harnesses without ignored tests). Thanks to @sandersaares
  • (#568, #646): Support running library benchmarks in a sandbox with LibraryBenchmarkConfig::sandbox, matching the existing binary benchmark sandbox behavior. Support changing the current directory for library benchmarks with LibraryBenchmarkConfig::current_dir.

Changed

  • (#635): Gungraun can avoid querying Cargo metadata when GUNGRAUN_WORKSPACE_ROOT and GUNGRAUN_HOME or CARGO_TARGET_DIR are set, improving support for running without executing cargo for example in containerized environments.
  • (#648): Support combining --save-baseline with --baseline to compare against one baseline while saving the current run under another baseline name.
  • Bump mdbook -> 0.5.2 and use mdbook-linkcheck2
  • Updated dependencies, including shlex 2, log, serde_json, and minijinja.

Fixed

  • (#635): Fixed --separate-targets metadata detection to use the rust build target of the gungraun library instead of the runner.
  • (#640): Fixed broken guide edit links.

New Contributors

Full Changelog: v0.19.0...v0.19.1

v0.19.0

15 May 15:20
6e2c01d

Choose a tag to compare

[0.19.0] - 2026-05-15

Changed

  • (#607, #610): Bumped the MSRV from Rust 1.74.1 to 1.85.1. Bumped the workspace edition from Rust 2021 to Rust 2024.
  • (#607, #608, and others): Updated dependencies, including migrating internal benchmark configuration encoding from bincode to bincode-next.
  • (#609, #628): Replaced the thread-pool busy loop with a condition-variable based wakeup mechanism to avoid CPU usage while worker threads are idle.
  • (#627): Set Valgrind --vgdb=no by default because it can cause problems in qemu-based runs.
  • Bumped gungraun-macros from 0.8.0 to 0.9.0.

Fixed

  • (#625): Fixed --valgrind-args from the CLI or env GUNGRAUN_VALGRIND_ARGS not being added to the final Valgrind argument list.

Full Changelog: v0.18.2...v0.19.0

v0.18.2

30 Apr 09:06

Choose a tag to compare

[0.18.2] - 2026-04-30

Changed

  • (#604): Extraction of the valgrind-requests package from the gungraun package. For the gungraun package this is purely cosmetic and doesn't introduce api changes.
  • Update dependencies

Fixed

  • Small documentation fixes in the libraries and guide across multiple prs: Typos, capitalization, wrong indentation in code blocks, ...

Full Changelog: v0.18.1...v0.18.2

v0.18.1

10 Apr 21:30
0c3125f

Choose a tag to compare

[0.18.1] - 2026-04-10

Fixed

  • (#588): Fix thread pool causing excessive CPU usage and slowdown when using multiple benchmark groups. Thread pools were not being properly shut down leaving worker threads stuck in hot loops.

Full Changelog: v0.18.0...v0.18.1

v0.18.0

09 Apr 14:26
85d3fa3

Choose a tag to compare

[0.18.0] - 2026-04-09

Added

  • (#565): --parallel CLI option and environment variable GUNGRAUN_PARALLEL to run benchmarks in parallel. max_parallel parameter in library_benchmark_group! and binary_benchmark_group! to be able to limit parallelism by benchmark group.
  • (#575): Support const generic parameters in benchmark functions
  • (#583): Support a custom valgrind runner with command-line arguments:
    • --valgrind-runner (env: GUNGRAUN_VALGRIND_RUNNER) option to run Valgrind through a container or alternative execution environment.
    • --valgrind-runner-args (env: GUNGRAUN_VALGRIND_RUNNER_ARGS) to pass additional arguments to the custom runner with support for environment variable interpolation using ${VAR} syntax.
    • --valgrind-bin (env: GUNGRAUN_VALGRIND_BIN) to specify a Valgrind executable path.
    • --valgrind-runner-dest (env: GUNGRAUN_VALGRIND_RUNNER_DEST) to override the destination directory for Valgrind output files.
    • --valgrind-runner-root (env: GUNGRAUN_VALGRIND_RUNNER_ROOT) to override the workspace root directory path.
    • Expose environment variables GUNGRAUN_VR_DEST_DIR, GUNGRAUN_VR_HOME, GUNGRAUN_VR_WORKSPACE_ROOT, GUNGRAUN_ALLOW_ASLR for custom valgrind runners.
  • (#583): Customize environment variables on the command-line with:
    • --env-clear (env: GUNGRAUN_ENV_CLEAR) CLI argument to control environment variable clearing behavior for benchmarks.
    • --envs CLI argument to pass environment variables to benchmarks from the command line (supports both passthrough --envs=VAR and explicit --envs=VAR=value).
  • (#585): gungraun::prelude module for convenient importing of commonly used items: library_benchmark, library_benchmark_group, binary_benchmark, binary_benchmark_group, main!, LibraryBenchmarkConfig, BinaryBenchmarkConfig, and Command.

Changed

  • (#565): Improved performance of serial benchmark execution:
    • Execute the benchmark and then process and print the data while already executing the next benchmark.
    • By using a temporary directory for the new valgrind data which most likely is an in-memory file system like tmpfs
  • (#565): Output format changes: Consts arguments are shown in the DESCRIPTION of the the benchmark output module::path id:DESCRIPTION in brackets in addition to the normal benchmark function arguments (file::group::func id:<A, B>(arg1, arg2)). To keep the output format consistent, the description now shows arguments always in parentheses even when no consts were given (a::b::c id:(arg1, arg2)). Additionally, binary benchmarks without an id now separate the DESCRIPTION from the module path with a : as in a::b::c :DESCRIPTION.
  • (#583): --bbv-args, --cachegrind-args, --callgrind-args, --dhat-args, --drd-args, --helgrind-args, --massif-args, --memcheck-args, --valgrind-args now support specifying valgrind arguments without the -- flag for convenience. For example: --callgrind-args='toggle-collect=some::*' instead of --callgrind-args='--toggle-collect=some::*'
  • Update, fix and improve the guide and other documentation in various PRs: Added missing documentation, fixed typos, ...
  • Update dependencies

Removed

  • (#565): Discarded printing of log file content with log level: info.

Fixed

  • (#583): --bbv-args, --cachegrind-args, --callgrind-args, --dhat-args, --drd-args, --helgrind-args, --massif-args, --memcheck-args, --valgrind-args are now parsing multiple space separated argument lists correctly and split them according to POSIX shell arguments.
  • (#584): Various small fixes and improvements to the --help output. Changed the ordering of some --flags to group them according to similar functionality. Especially, the short help -h is now fixed and shows a quick summary of the long --help output instead of the long help itself.
  • (#584): Added --no-capture and --no-summary as aliases for --nocapture and --nosummary. Ignore --fail-fast of the original rust test harness.

Full Changelog: v0.17.2...v0.18.0

v0.17.2

10 Feb 09:23
68408f2

Choose a tag to compare

[0.17.2] - 2026-02-10

Fixed

  • (#532): Build on docs.rs fails because docs_auto_cfg was removed and merged into docs_cfg in version 1.92.0

Full Changelog: v0.17.1...v0.17.2

v0.17.1

10 Feb 06:19

Choose a tag to compare

[0.17.1] - 2026-02-10

Added

  • (#489): Support calling gungraun-runner with arguments --help, -h and --version, -V.

Changed

  • (#521): Added a rustfmt-able syntax for the library_benchmark_group!,
    binary_benchmark_group! and main! macros. Instead of ; using , and an array with bracket notation for the list of benchmarks and groups is a syntax that rustfmt recognizes and can therefore format properly. The old ; syntax is still valid but was replaced with the new one in all docs and examples.
  • Update dependencies

Fixed

  • (#515): Fix usages of --collect-at-start to --collect-atstart in the guide.
  • (#525): Nested benchmark file structures were restricted by the internal usages of #[export_name]. These usages were removed and replaced by an improved internal structure of the benchmark module.
  • (#525): Fixed possible ambiguous matches of dhat frames and functions when the default entry point was used.
  • (#525): Fixed custom dhat frames were only matched when the default entry point was used.
  • (#530): Fixed rare cases of callgrind stats depending on the function name.
  • Fixed dead links in the guide.

Full Changelog: v0.17.0...v0.17.1

v0.17.0

22 Sep 01:31

Choose a tag to compare

[0.17.0] - 2025-09-22

We've outgrown our original name! With the 0.17.0 version the project was renamed to Gungraun. The packages were renamed from iai-callgrind to gungraun, iai-callgrind-runner to gungraun-runner and iai-callgrind-macros to gungraun-macros. Earlier releases remain available under the old name. Thank you for your understanding — we look forward to continuing development under the new name!

Here's a short migration check-list:

  • Update the library: Rename iai-callgrind to gungraun in your Cargo.toml and use a version >=0.17.0.
  • Update all usages of use iai_callgrind to use gungraun
  • Update the binary: Uninstall the old binary with cargo uninstall iai-callgrind-runner. Install the new binary for example with binstall: cargo binstall gungraun-runner@0.17.0
  • Update any scripts which installed iai-callgrind-runner in the CI to use gungraun-runner.
  • If you are parsing the benchmark output: The summary line has changed from Iai-Callgrind result: Ok, ... to Gungraun result: Ok, ...
  • Update any environment variable names to use the GUNGRAUN prefix instead of IAI_CALLGRIND. For example IAI_CALLGRIND_LOG=warn -> GUNGRAUN_LOG=warn or IAI_CALLGRIND_VALGRIND_INCLUDE=... to GUNGRAUN_VALGRIND_INCLUDE=....
  • If you want to keep the old benchmark output from the target/iai directory, simply rename it to target/gungraun.
  • Rename benchmark files to use gungraun instead of iai or iai_callgrind. This will also change the output directory. If you want to keep the old files, for example when renaming the old benchmarks of the my_iai_callgrind_benchmarks.rs file to my_gungraun_benchmarks.rs, then the output directory changes from target/iai/my_package/my_iai_callgrind_benchmarks to target/gungraun/my_package/my_gungraun_benchmarks

All changes are detailed below. Notably, this version introduces two other significant updates: DHAT metrics now exclude setup and teardown costs, aligning them with the behavior of callgrind and cachegrind. Additionally, the new iter keyword in the #[benches] attribute enables the creation of benchmarks from an iterator. For instance, #[benches::some_id(iter = 0..3)] generates three benchmarks with the inputs 0, 1, and 2, while also supporting more complex iterators.

Added

  • (#427): Support assembly optimized valgrind client requests for the riscv64gc-unknown-linux-gnu target
  • (#429): Add new iter syntax for the benches macro which takes an iterator as argument and creates a benchmark for each iterator element. For example #[benches::some_id(iter = [1, 2, 3])] creates a benchmark for the inputs 1, 2 and 3.
  • (#434): Add the command-line arguments --show-intermediate, --truncate-description and --show-grid and respective environment variables which work exactly like the already existing options for the OutputFormat.
  • (#436): Add command-line argument --show-only-comparison and the respective environment variable to show only the comparison by id with other benchmarks excluding the self-comparison.

Changed

  • (#429): Dhat metrics now exclude setup costs exactly like callgrind and cachegrind metrics.
  • (#475): The package names have been changed from
    • iai-callgrind -> gungraun
    • iai-callgrind-runner -> gungraun-runner
    • iai-callgrind-macros -> gungraun-macros
      The name of the iai-callgrind-runner binary has changed with the package name to gungraun-runner.
  • (#475): All environment variables have changed their prefix from IAI_CALLGRIND to GUNGRAUN without any exceptions. Here's an incomplete list:
    • IAI_CALLGRIND_ALLOW_ASLR -> GUNGRAUN_ALLOW_ASLR
    • IAI_CALLGRIND_BASELINE -> GUNGRAUN_BASELINE
    • IAI_CALLGRIND_BBV_ARGS -> GUNGRAUN_BBV_ARGS
    • IAI_CALLGRIND_CACHEGRIND_ARGS -> GUNGRAUN_CACHEGRIND_ARGS
    • IAI_CALLGRIND_CACHEGRIND_LIMITS -> GUNGRAUN_CACHEGRIND_LIMITS
    • IAI_CALLGRIND_CACHEGRIND_METRICS -> GUNGRAUN_CACHEGRIND_METRICS
    • IAI_CALLGRIND_CALLGRIND_ARGS -> GUNGRAUN_CALLGRIND_ARGS
    • IAI_CALLGRIND_CALLGRIND_LIMITS -> GUNGRAUN_CALLGRIND_LIMITS
    • IAI_CALLGRIND_CALLGRIND_METRICS -> GUNGRAUN_CALLGRIND_METRICS
    • IAI_CALLGRIND_COLOR -> GUNGRAUN_COLOR
    • IAI_CALLGRIND_DEFAULT_TOOL -> GUNGRAUN_DEFAULT_TOOL
    • IAI_CALLGRIND_DHAT_ARGS -> GUNGRAUN_DHAT_ARGS
    • IAI_CALLGRIND_DHAT_LIMITS -> GUNGRAUN_DHAT_LIMITS
    • IAI_CALLGRIND_DHAT_METRICS -> GUNGRAUN_DHAT_METRICS
    • IAI_CALLGRIND_DRD_ARGS -> GUNGRAUN_DRD_ARGS
    • IAI_CALLGRIND_DRD_METRICS -> GUNGRAUN_DRD_METRICS
    • IAI_CALLGRIND_FILTER -> GUNGRAUN_FILTER
    • IAI_CALLGRIND_HELGRIND_ARGS -> GUNGRAUN_HELGRIND_ARGS
    • IAI_CALLGRIND_HELGRIND_METRICS -> GUNGRAUN_HELGRIND_METRICS
    • IAI_CALLGRIND_HOME -> GUNGRAUN_HOME
    • IAI_CALLGRIND_LIST -> GUNGRAUN_LIST
    • IAI_CALLGRIND_LOAD_BASELINE -> GUNGRAUN_LOAD_BASELINE
    • IAI_CALLGRIND_LOG -> GUNGRAUN_LOG
    • IAI_CALLGRIND_MASSIF_ARGS -> GUNGRAUN_MASSIF_ARGS
    • IAI_CALLGRIND_MEMCHECK_ARGS -> GUNGRAUN_MEMCHECK_ARGS
    • IAI_CALLGRIND_MEMCHECK_METRICS -> GUNGRAUN_MEMCHECK_METRICS
    • IAI_CALLGRIND_NOCAPTURE -> GUNGRAUN_NOCAPTURE
    • IAI_CALLGRIND_NOSUMMARY -> GUNGRAUN_NOSUMMARY
    • IAI_CALLGRIND_OUTPUT_FORMAT -> GUNGRAUN_OUTPUT_FORMAT
    • IAI_CALLGRIND_REGRESSION_FAIL_FAST -> GUNGRAUN_REGRESSION_FAIL_FAST
    • IAI_CALLGRIND_SAVE_BASELINE -> GUNGRAUN_SAVE_BASELINE
    • IAI_CALLGRIND_SAVE_SUMMARY -> GUNGRAUN_SAVE_SUMMARY
    • IAI_CALLGRIND_SEPARATE_TARGETS -> GUNGRAUN_SEPARATE_TARGETS
    • IAI_CALLGRIND_SHOW_GRID -> GUNGRAUN_SHOW_GRID
    • IAI_CALLGRIND_SHOW_INTERMEDIATE -> GUNGRAUN_SHOW_INTERMEDIATE
    • IAI_CALLGRIND_SHOW_ONLY_COMPARISON -> GUNGRAUN_SHOW_ONLY_COMPARISON
    • IAI_CALLGRIND_TOLERANCE -> GUNGRAUN_TOLERANCE
    • IAI_CALLGRIND_TOOLS -> GUNGRAUN_TOOLS
    • IAI_CALLGRIND_TRUNCATE_DESCRIPTION -> GUNGRAUN_TRUNCATE_DESCRIPTION
    • IAI_CALLGRIND_VALGRIND_ARGS -> GUNGRAUN_VALGRIND_ARGS
  • (#475): The default output directory for the benchmark files has been moved from target/iai to target/gungraun.
  • (#475): The summary line now concludes with Gungraun result: Ok, ... instead of Iai-Callgrind result: Ok, ....
  • (#477): The positional command-line argument FILTER now matches the full module path with wildcard patterns to filter and run only the selected benchmarks. The summary line in the benchmark output now shows an additional field with the amount of filtered benchmarks. For example:
    Gungraun result: Ok. ...; 1 filtered; 2 benchmarks ...
  • Update direct dependencies: cc, serde, serde_json, clap, slab, syn, proc-macro2, regex, indexmap, cfg-if, log

Fixed

  • (#455): The old details of a ProfilePart were stored on the wrong side left (new) instead of right (old).

Full Changelog: v0.16.1...v0.17.0

v0.16.1

30 Jul 11:03
27399d0

Choose a tag to compare

[0.16.1] - 2025-07-30

Added

  • (#411): Add ability to set report tolerance. Thanks to @nihohit
  • (#419): Add support for the valgrind command-line arguments --xtree-memory and memcheck's --xtree-leak. The output files extension is .xtree for --xtree-memory and .xleak for --xtree-leak.
  • (#420): Add command-line arguments --callgrind-metrics (env: IAI_CALLGRIND_CALLGRIND_METRICS), --cachegrind-metrics (env: IAI_CALLGRIND_CACHEGRIND_METRICS), --dhat-metrics (env: IAI_CALLGRIND_DHAT_METRICS), --drd-metrics (env: IAI_CALLGRIND_DRD_METRICS), --memcheck-metrics (env: IAI_CALLGRIND_MEMCHECK_METRICS), --helgrind-metrics (env: IAI_CALLGRIND_HELGRIND_METRICS) to be able to adjust the shown metrics and their order in the terminal output of the respective tool.
  • (#421): Add --tolerance (env: IAI_CALLGRIND_TOLERANCE) to be able to adjust the tolerance level on the command-line (in addition to #411).
  • (c9cbcf6): Build artifacts of the iai-callgrind-runner for the riscv64 target. The artifacts were added retroactively for all releases >=v0.12.0.
  • (52d71ad): Add mapping of iai-callgrind-runner version to json schema version to the guide.

Changed

  • (#417): backwards-compatible change of summary.v6.schema.json. The order and documentation of items changes.
  • (#422): Resort and group the options in the --help output for Iai-Callgrind command-line arguments.
  • Update direct dependencies: strum

Removed

  • (#417): Unused dependencies: serde_regex, tokio

Fixed

  • (52d71ad): Removed the wrong link to schema version v2 in the machine-readable output section of guide.
  • (#417): -v in arguments for tools other than cachegrind and callgrind was not parsed the same way as --verbose

Full Changelog: v0.16.0...v0.16.1