Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

Unreleased

0.2.11 - 2019-04-08

Added

  • Enabled automatic text-coloring on Windows.

Fixed

  • Fixed panic caused by outdated files after benchmark names or types were changed.
  • Reduced timing overhead of Criterion::iter_batched/iter_batched_ref.

0.2.10 - 2019-02-09

Added

  • Added iter_batched/iter_batched_ref timing loops, which allow for setup (like iter_with_setup/iter_with_large_setup) and exclude drop (like iter_with_large_drop) but measure the runtime more accurately, use less memory and are more flexible.

Deprecated

  • iter_with_setup/iter_with_large_setup are now deprecated in favor of iter_batched.

0.2.9 - 2019-01-24

Changed

  • Criterion.rs no longer depends on the default features of the rand-core crate. This fixes some downstream crates which use rand in a no_std context.

0.2.8 - 2019-01-20

Changed

  • Criterion.rs now uses rayon internally instead of manual unsafe code built with thread-scoped.
  • Replaced handlebars templates with TinyTemplate
  • Merged criterion-stats crate into criterion crate. criterion-stats will no longer receive updates.
  • Replaced or removed various other dependencies to reduce the size of Criterion.rs' dependency tree.

0.2.7 - 2018-12-29

Fixed

  • Fixed version numbers to prevent incompatibilities between criterion and criterion-stats crates.

0.2.6 - 2018-12-27 - Yanked

Added

  • Added --list command line option, which lists the benchmarks but does not run them, to match cargo test -- --list.
  • Added README/CONTRIBUTING/LICENSE files to sub-crates.
  • Displays change in throughput in the command-line and HTML output as well as change in iteration time.
  • Benchmarks with multiple functions and multiple values will now generate a per-value summary report file in addition to the existing per-function one.
  • Added a --profile-time command-line argument which disables reporting and analysis and instead simply iterates each benchmark for approximately the given number of seconds. This supersedes the (now-deprecated) --measure-only argument.

Fixed

  • Functions passed to Bencher::iter_with_large_setup can now return output. This is necessary to prevent the compiler from optimizing away the benchmark. This is technically a breaking change - that function requires a new type parameter. It's so unlikely to break existing code that I decided not to delay this for a breaking-change release.
  • Reduced measurement overhead for the iter_with_large_setup and iter_with_drop methods.
  • criterion_group and criterion_main macros no longer require the Criterion struct to be explicitly imported.
  • Don't panic when gnuplot --version fails.
  • Criterion.rs macros no longer require user to use criterion::Criterion;
  • Criterion.rs no longer initializes a logger, meaning that it will no longer conflict with user code which does.
  • Criterion.rs no longer fails to parse gnuplot version numbers like gnuplot 5.2 patchlevel 5a (Gentoo revision r0)
  • Criterion.rs no longer prints an error message that gnuplot couldn't be found when chart generation is disabled (either by Criterion::without_plots, --noplot or disabling the HTML reports feature)
  • Benchmark names are now automatically truncated to 100 characters and a number may be added to make them unique. This fixes a problem where gnuplot would crash if the title was extremely long, and also improves the general usability of Criterion.rs.

Changed

  • Changed timing model of iter_with_large_setup to exclude time spent dropping values returned by the routine. Time measurements taken with 0.2.6 using these methods may differ from those taken with 0.2.5.
  • Benchmarks with multiple functions and multiple values will now appear as a table rather than a tree in the benchmark index. This is to accommodate the new per-value summary reports.

Deprecated

  • Deprecated the --measure-only command-line-argument in favor of --profile-time. This will be removed in 0.3.0.
  • External-program benchmarks are now deprecated. They will be removed in 0.3.0.
  • The html_reports cargo feature is now deprecated. This feature will become non-optional in 0.3.0.
  • Sample sizes less than 10 are deprecated and will be disallowed in 0.3.0.
  • This is not an exhaustive list - the full scope of changes in 0.3.0 is not yet determined. There may be breaking changes that are not listed here.

0.2.5 - 2018-08-27

Fixed

  • Fixed links from generated report files to documentation.
  • Fixed formatting for very large percentage changes (>1000%)
  • Sorted the benchmarks in the index report by name
  • Fixed case where benchmark ID with special characters would cause Criterion.rs to open the wrong file and log an error message.
  • Fixed case where running cargo clean; cargo bench -- <filter> would cause Criterion.rs to log an error message.
  • Fixed a GNUplot error message when sample size is very small.
  • Fixed several cases where Criterion.rs would generate invalid path names.
  • Fixed a bug where Criterion.rs would print an error if run with a filter that allowed no benchmarks and a clean target directory.
  • Fixed bug where some benchmarks didn't appear in the benchmark index report.
  • Criterion.rs now honors the CARGO_TARGET_DIR environment variable.

Added

  • Criterion.rs will generate a chart showing the effects of changes in input (or input size) for all benchmarks with numeric inputs or throughput, not just for those which compare multiple functions.

0.2.4 2018-07-08

Added

  • Added a pair of flags, --save-baseline and --baseline, which change how benchmark results are stored and compared. This is useful for working against a fixed baseline(eg. comparing progress on an optimization feature branch to the commit it forked from). Default behavior of Criterion.rs is now --save-baseline base which emulates the previous, user facing behavior.
    • --save-baseline saves the benchmark results under the provided name.
    • --baseline compares the results to a saved baseline. If the baseline does not exist for a benchmark, an error is given.
  • Added user-guide documentation for baselines, throughput measurements and plot configuration.
  • Added a flag, --test, which causes Criterion to execute the benchmarks once without measuring or reporting the results. This is useful for checking that the benchmarks run successfully in a CI setting.
  • Added a raw.csv file to the output which contains a stable, machine-readable representation of the measurements taken by benchmarks. This enables users to perform their own analysis or keep historical information without depending on private implementation details.

Fixed

  • The sample_size method on the Criterion, Benchmark and ParameterizedBenchmark structs has been changed to panic if the sample size is less than 2. Other parts of the code require this and will panic if the sample size is 1, so this is not considered to be a breaking change.
  • API documentation has been updated to show more-complete examples.
  • Certain characters will now be replaced with underscores when creating benchmark directory paths, to avoid generating invalid or unexpected paths.

0.2.3 - 2018-04-14

Fixed

  • Criterion.rs will now panic with a clear error message if the user attempts to run a benchmark which doesn't call the Bencher::iter function or a related function, rather than failing in an uncontrolled manner later.
  • Fixed broken links in some more summary reports.

Added

  • Added a --measure-only argument which causes the benchmark executable to run the warmup and measurement and then move on to the next benchmark without analyzing or saving data. This is useful to prevent Criterion.rs' analysis code from appearing in profile data when profiling benchmarks.
  • Added an index report file at “target/criterion/report/index.html” which links to the other reports for easy navigation.

0.2.2 - 2018-03-25

Fixed

  • Fixed broken links in some summary reports.
  • Work around apparent rustc bug in >= 1.24.0.

0.2.1 - 2018-02-24

Added

  • HTML reports are now a default Cargo feature. If you wish to disable HTML reports, disable Criterion.rs' default features. Doing so will allow compatibility with older Rust versions such as 1.20. If you wish to continue using HTML reports, you don't need to do anything.
  • Added a summary report for benchmarks that compare multiple functions or different inputs.

Changed

  • The plots and HTML reports are now generated in a report folder.

Fixed

  • Underscores in benchmark names will no longer cause subscripted characters to appear in generated plots.

0.2.0 - 2018-02-05

Added

  • Added Criterion.bench function, which accepts either a Benchmark or ParameterizedBenchmark. These new structures allow for custom per-benchmark configuration as well as more complex benchmark grouping (eg. comparing a Rust function against an external program over a range of inputs) which was not possible previously.
  • Criterion.rs can now report the throughput of the benchmarked code in units of bytes or elements per second. See the Benchmark.throughput and ParameterizedBenchmark.throughput functions for further details.
  • Criterion.rs now generates a basic HTML report for each benchmark.
  • Added --noplot command line option to disable plot generation.

Changed

  • The builder methods on the Criterion struct now take and return self by value for easier chaining. Functions which configure a Criterion structure will need to be updated accordingly, or will need to be changed to work with the Benchmark or ParameterizedBenchmark types to do per-benchmark configuration instead.
  • The closures taken by Criterion.bench_* must now have a 'static lifetime. This means that you may need to change your closures from |bencher| {...} to move |bencher| {...}.
  • Criterion.bench_functions now takes I as an input parameter, not &I.
  • Input values must now implement Debug rather than Display.
  • The generated plots are stored in target/criterion rather than .criterion.

Removed

  • The hidden criterion::ConfidenceInterval andcriterion::Estimate types are no longer publicly accessible.
  • The Criterion.summarize function has been removed.

Fixed

  • Fixed the relative mean and median reports.
  • Fixed panic while summarizing benchmarks.

0.1.2 - 2018-01-12

Changed

  • Criterion.rs is now stable-compatible!
  • Criterion.rs now includes its own stable-compatible black_box function. Some benchmarks may now be affected by dead-code-elimination where they previously weren't and may have to be updated.
  • Criterion.rs now uses serde to save results. Existing results files will be automatically removed when benchmarks are run.
  • Redesigned the command-line output to highlight the important information and reduce noise.

Added

  • Running benchmarks with the variable “CRITERION_DEBUG” in the environment will cause Criterion.rs to generate extra debug output and save the gnuplot scripts alongside the generated plots.

Fixed

  • Don't panic on IO errors or gnuplot failures
  • Fix generation of invalid gnuplot scripts when benchmarking over inputs and inputs include values <= 0.
  • Bug where benchmarks would run one sample fewer than was configured.

Removed

  • Generated plots will no longer use log-scale.

0.1.1 - 2017-12-12

Added

  • A changelog file.
  • Added a chapter to the book on how Criterion.rs collects and analyzes data.
  • Added macro rules to generate a test harness for use with cargo bench. Benchmarks defined without these macros should continue to work.
  • New contribution guidelines
  • Criterion.rs can selectively run benchmarks. See the Command-line page for more details

0.1.0 - 2017-12-02

Added

  • Initial release on Crates.io.