Releases: gungraun/gungraun
v0.19.2
v0.19.1
[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_outputoption controls whether output files are sanitized. Optionally, keep.origbackups withSanitizeOutput::KeepOrig. - (#644): Honor
--format tersewhen combined with--listso gungraun bench binaries are compatible withcargo nextesttest discovery. Terse output contains only the per-benchmark lines without the trailing blank line and0 tests, N benchmarkssummary that the default libtest-pretty listing emits. The previously hidden libtest-compat--formatshim now actually honors the value; any value other thanterse(includingpretty,json,junit, the empty string, or unknown values) falls back to the existing pretty output.--list --format terse --ignoredemits 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 withLibraryBenchmarkConfig::current_dir.
Changed
- (#635): Gungraun can avoid querying Cargo metadata when
GUNGRAUN_WORKSPACE_ROOTandGUNGRAUN_HOMEorCARGO_TARGET_DIRare set, improving support for running without executingcargofor example in containerized environments. - (#648): Support combining
--save-baselinewith--baselineto 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
shlex2,log,serde_json, andminijinja.
Fixed
- (#635): Fixed
--separate-targetsmetadata detection to use the rust build target of thegungraunlibrary instead of the runner. - (#640): Fixed broken guide edit links.
New Contributors
- @sandersaares made their first contribution in #644
Full Changelog: v0.19.0...v0.19.1
v0.19.0
[0.19.0] - 2026-05-15
Changed
- (#607, #610): Bumped the MSRV from Rust
1.74.1to1.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
bincodetobincode-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=noby default because it can cause problems in qemu-based runs. - Bumped
gungraun-macrosfrom0.8.0to0.9.0.
Fixed
- (#625): Fixed
--valgrind-argsfrom the CLI or envGUNGRAUN_VALGRIND_ARGSnot being added to the final Valgrind argument list.
Full Changelog: v0.18.2...v0.19.0
v0.18.2
[0.18.2] - 2026-04-30
Changed
- (#604): Extraction of the
valgrind-requestspackage from thegungraunpackage. For thegungraunpackage 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
[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
[0.18.0] - 2026-04-09
Added
- (#565):
--parallelCLI option and environment variableGUNGRAUN_PARALLELto run benchmarks in parallel.max_parallelparameter inlibrary_benchmark_group!andbinary_benchmark_group!to be able to limit parallelism by benchmark group. - (#575): Support
constgeneric 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_ASLRfor 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.--envsCLI argument to pass environment variables to benchmarks from the command line (supports both passthrough--envs=VARand explicit--envs=VAR=value).
- (#585):
gungraun::preludemodule for convenient importing of commonly used items:library_benchmark,library_benchmark_group,binary_benchmark,binary_benchmark_group,main!,LibraryBenchmarkConfig,BinaryBenchmarkConfig, andCommand.
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:DESCRIPTIONin 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 ina::b::c :DESCRIPTION. - (#583):
--bbv-args,--cachegrind-args,--callgrind-args,--dhat-args,--drd-args,--helgrind-args,--massif-args,--memcheck-args,--valgrind-argsnow 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-argsare now parsing multiple space separated argument lists correctly and split them according to POSIX shell arguments. - (#584): Various small fixes and improvements to the
--helpoutput. Changed the ordering of some --flags to group them according to similar functionality. Especially, the short help-his now fixed and shows a quick summary of the long--helpoutput instead of the long help itself. - (#584): Added
--no-captureand--no-summaryas aliases for--nocaptureand--nosummary. Ignore--fail-fastof the original rust test harness.
Full Changelog: v0.17.2...v0.18.0
v0.17.2
[0.17.2] - 2026-02-10
Fixed
- (#532): Build on docs.rs fails because
docs_auto_cfgwas removed and merged intodocs_cfgin version 1.92.0
Full Changelog: v0.17.1...v0.17.2
v0.17.1
[0.17.1] - 2026-02-10
Added
- (#489): Support calling
gungraun-runnerwith arguments--help,-hand--version,-V.
Changed
- (#521): Added a rustfmt-able syntax for the
library_benchmark_group!,
binary_benchmark_group!andmain!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-startto--collect-atstartin 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
[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-callgrindtogungraunin yourCargo.tomland use a version>=0.17.0. - Update all usages of
use iai_callgrindtouse 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-runnerin the CI to usegungraun-runner. - If you are parsing the benchmark output: The summary line has changed from
Iai-Callgrind result: Ok, ...toGungraun result: Ok, ... - Update any environment variable names to use the
GUNGRAUNprefix instead ofIAI_CALLGRIND. For exampleIAI_CALLGRIND_LOG=warn->GUNGRAUN_LOG=warnorIAI_CALLGRIND_VALGRIND_INCLUDE=...toGUNGRAUN_VALGRIND_INCLUDE=.... - If you want to keep the old benchmark output from the
target/iaidirectory, simply rename it totarget/gungraun. - Rename benchmark files to use
gungrauninstead ofiaioriai_callgrind. This will also change the output directory. If you want to keep the old files, for example when renaming the old benchmarks of themy_iai_callgrind_benchmarks.rsfile tomy_gungraun_benchmarks.rs, then the output directory changes fromtarget/iai/my_package/my_iai_callgrind_benchmarkstotarget/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-gnutarget - (#429): Add new
itersyntax for thebenchesmacro 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 inputs1,2and3. - (#434): Add the command-line arguments
--show-intermediate,--truncate-descriptionand--show-gridand respective environment variables which work exactly like the already existing options for theOutputFormat. - (#436): Add command-line argument
--show-only-comparisonand 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->gungrauniai-callgrind-runner->gungraun-runneriai-callgrind-macros->gungraun-macros
The name of theiai-callgrind-runnerbinary has changed with the package name togungraun-runner.
- (#475): All environment variables have changed their prefix from
IAI_CALLGRINDtoGUNGRAUNwithout any exceptions. Here's an incomplete list:IAI_CALLGRIND_ALLOW_ASLR->GUNGRAUN_ALLOW_ASLRIAI_CALLGRIND_BASELINE->GUNGRAUN_BASELINEIAI_CALLGRIND_BBV_ARGS->GUNGRAUN_BBV_ARGSIAI_CALLGRIND_CACHEGRIND_ARGS->GUNGRAUN_CACHEGRIND_ARGSIAI_CALLGRIND_CACHEGRIND_LIMITS->GUNGRAUN_CACHEGRIND_LIMITSIAI_CALLGRIND_CACHEGRIND_METRICS->GUNGRAUN_CACHEGRIND_METRICSIAI_CALLGRIND_CALLGRIND_ARGS->GUNGRAUN_CALLGRIND_ARGSIAI_CALLGRIND_CALLGRIND_LIMITS->GUNGRAUN_CALLGRIND_LIMITSIAI_CALLGRIND_CALLGRIND_METRICS->GUNGRAUN_CALLGRIND_METRICSIAI_CALLGRIND_COLOR->GUNGRAUN_COLORIAI_CALLGRIND_DEFAULT_TOOL->GUNGRAUN_DEFAULT_TOOLIAI_CALLGRIND_DHAT_ARGS->GUNGRAUN_DHAT_ARGSIAI_CALLGRIND_DHAT_LIMITS->GUNGRAUN_DHAT_LIMITSIAI_CALLGRIND_DHAT_METRICS->GUNGRAUN_DHAT_METRICSIAI_CALLGRIND_DRD_ARGS->GUNGRAUN_DRD_ARGSIAI_CALLGRIND_DRD_METRICS->GUNGRAUN_DRD_METRICSIAI_CALLGRIND_FILTER->GUNGRAUN_FILTERIAI_CALLGRIND_HELGRIND_ARGS->GUNGRAUN_HELGRIND_ARGSIAI_CALLGRIND_HELGRIND_METRICS->GUNGRAUN_HELGRIND_METRICSIAI_CALLGRIND_HOME->GUNGRAUN_HOMEIAI_CALLGRIND_LIST->GUNGRAUN_LISTIAI_CALLGRIND_LOAD_BASELINE->GUNGRAUN_LOAD_BASELINEIAI_CALLGRIND_LOG->GUNGRAUN_LOGIAI_CALLGRIND_MASSIF_ARGS->GUNGRAUN_MASSIF_ARGSIAI_CALLGRIND_MEMCHECK_ARGS->GUNGRAUN_MEMCHECK_ARGSIAI_CALLGRIND_MEMCHECK_METRICS->GUNGRAUN_MEMCHECK_METRICSIAI_CALLGRIND_NOCAPTURE->GUNGRAUN_NOCAPTUREIAI_CALLGRIND_NOSUMMARY->GUNGRAUN_NOSUMMARYIAI_CALLGRIND_OUTPUT_FORMAT->GUNGRAUN_OUTPUT_FORMATIAI_CALLGRIND_REGRESSION_FAIL_FAST->GUNGRAUN_REGRESSION_FAIL_FASTIAI_CALLGRIND_SAVE_BASELINE->GUNGRAUN_SAVE_BASELINEIAI_CALLGRIND_SAVE_SUMMARY->GUNGRAUN_SAVE_SUMMARYIAI_CALLGRIND_SEPARATE_TARGETS->GUNGRAUN_SEPARATE_TARGETSIAI_CALLGRIND_SHOW_GRID->GUNGRAUN_SHOW_GRIDIAI_CALLGRIND_SHOW_INTERMEDIATE->GUNGRAUN_SHOW_INTERMEDIATEIAI_CALLGRIND_SHOW_ONLY_COMPARISON->GUNGRAUN_SHOW_ONLY_COMPARISONIAI_CALLGRIND_TOLERANCE->GUNGRAUN_TOLERANCEIAI_CALLGRIND_TOOLS->GUNGRAUN_TOOLSIAI_CALLGRIND_TRUNCATE_DESCRIPTION->GUNGRAUN_TRUNCATE_DESCRIPTIONIAI_CALLGRIND_VALGRIND_ARGS->GUNGRAUN_VALGRIND_ARGS
- (#475): The default output directory for the benchmark files has been moved from
target/iaitotarget/gungraun. - (#475): The summary line now concludes with
Gungraun result: Ok, ...instead ofIai-Callgrind result: Ok, .... - (#477): The positional command-line argument
FILTERnow 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
olddetails of aProfilePartwere stored on the wrong sideleft(new) instead ofright(old).
Full Changelog: v0.16.1...v0.17.0
v0.16.1
[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-memoryand memcheck's--xtree-leak. The output files extension is.xtreefor--xtree-memoryand.xleakfor--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-runnerfor theriscv64target. 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
--helpoutput 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 outputsection of guide. - (#417):
-vin arguments for tools other than cachegrind and callgrind was not parsed the same way as--verbose
Full Changelog: v0.16.0...v0.16.1