| # Changelog |
| |
| All notable changes to this project will be documented in this file. |
| |
| The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) |
| and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). |
| |
| ## [Unreleased] |
| |
| ## [0.4.0] - 2022-09-10 |
| |
| ### Removed |
| |
| - The `Criterion::can_plot` function has been removed. |
| - The `Criterion::bench_function_over_inputs` function has been removed. |
| - The `Criterion::bench_functions` function has been removed. |
| - The `Criterion::bench` function has been removed. |
| |
| ### Changed |
| |
| - HTML report hidden behind non-default feature flag: 'html_reports' |
| - Standalone support (ie without cargo-criterion) feature flag: 'cargo_bench_support' |
| - MSRV bumped to 1.57 |
| - `rayon` and `plotters` are optional (and default) dependencies. |
| - Status messages ('warming up', 'analyzing', etc) are printed to stderr, benchmark results are printed to stdout. |
| - Accept subsecond durations for `--warm-up-time`, `--measurement-time` and `--profile-time`. |
| - Replaced serde_cbor with ciborium because the former is no longer maintained. |
| - Upgrade clap to v3 and regex to v1.5. |
| |
| ### Added |
| |
| - A `--discard-baseline` flag for discarding rather than saving benchmark results. |
| - Formal support for benchmarking code compiled to web-assembly. |
| - A `--quiet` flag for printing just a single line per benchmark. |
| - A `Throughput::BytesDecimal` option for measuring throughput in bytes but printing them using |
| decimal units like kilobytes instead of binary units like kibibytes. |
| |
| ### Fixed |
| - When using `bench_with_input`, the input parameter will now be passed through `black_box` before |
| passing it to the benchmark. |
| |
| ## [0.3.6] - 2022-07-06 |
| ### Changed |
| - MSRV bumped to 1.49 |
| - Symbol for microseconds changed from ASCII 'us' to unicode 'µs' |
| - Documentation fixes |
| - Clippy fixes |
| |
| ## [0.3.5] - 2021-07-26 |
| |
| ### Fixed |
| |
| - Corrected `Criterion.toml` in the book. |
| - Corrected configuration typo in the book. |
| |
| ### Changed |
| |
| - Bump plotters dependency to always include a bug-fix. |
| - MSRV bumped to 1.46. |
| |
| ## [0.3.4] - 2021-01-24 |
| |
| ### Added |
| |
| - Added support for benchmarking async functions |
| - Added `with_output_color` for enabling or disabling CLI output coloring programmatically. |
| |
| ### Fixed |
| |
| - Criterion.rs will now give a clear error message in case of benchmarks that take zero time. |
| - Added some extra code to ensure that every sample has at least one iteration. |
| - Added a notice to the `--help` output regarding "unrecognized option" errors. |
| - Increased opacity on violin charts. |
| - Fixed violin chart X axis not starting at zero in the plotters backend. |
| - Criterion.rs will now automatically detect the right output directory. |
| |
| ### Deprecated |
| |
| - `Criterion::can_plot` is no longer useful and is deprecated pending deletion in 0.4.0. |
| - `Benchmark` and `ParameterizedBenchmark` were already hidden from documentation, but are now |
| formally deprecated pending deletion in 0.4.0. Callers should use `BenchmarkGroup` instead. |
| - `Criterion::bench_function_over_inputs`, `Criterion::bench_functions`, and `Criterion::bench` were |
| already hidden from documentation, but are now formally deprecated pending deletion in 0.4.0. |
| Callers should use `BenchmarkGroup` instead. |
| - Three new optional features have been added; "html_reports", "csv_output" and |
| "cargo_bench_support". These features currently do nothing except disable a warning message at |
| runtime, but in version 0.4.0 they will be used to enable HTML report generation, CSV file |
| generation, and the ability to run in cargo-bench (as opposed to [cargo-criterion]). |
| "cargo_bench_support" is enabled by default, but "html_reports" and "csv_output" |
| are not. If you use Criterion.rs' HTML reports, it is recommended to switch to [cargo-criterion]. |
| If you use CSV output, it is recommended to switch to [cargo-criterion] and use the |
| `--message-format=json` option for machine-readable output instead. A warning message will be |
| printed at the start of benchmark runs which do not have "html_reports" or "cargo_bench_support" |
| enabled, but because CSV output is not widely used it has no warning. |
| |
| [cargo-criterion]: https://github.com/bheisler/cargo-criterion |
| |
| ## [0.3.3] - 2020-06-29 |
| |
| ### Added |
| |
| - Added `CRITERION_HOME` environment variable to set the directory for Criterion to store |
| its results and charts in. |
| - Added support for [cargo-criterion]. The long-term goal here is to remove code from Criterion-rs |
| itself to improve compile times, as well as to add features to `cargo-criterion` that are |
| difficult to implement in Criterion-rs. |
| - Add sampling mode option for benchmarks. This allows the user to change how Criterion.rs chooses |
| the iteration counts in each sample. By default, nothing will change for most benchmarks, but |
| very slow benchmarks will now run fewer iterations to fit in the desired number of samples. |
| This affects the statistics and plots generated. |
| |
| ### Changed |
| |
| - The serialization format for some of the files has changed. This may cause your first benchmark |
| run after updating to produce errors, but they're harmless and will go away after running the |
| benchmarks once. |
| |
| ### Fixed |
| |
| - Fixed a bug where the current measurement was not shown on the relative regression plot. |
| - Fixed rare panic in the plotters backend. |
| - Panic with a clear error message (rather than panicking messily later on) when the user sets the |
| group or function name to the empty string. |
| - Escape single quotes in benchmark names when generating Gnuplot scripts. |
| |
| ## [0.3.2] - 2020-04-26 |
| |
| ### Added |
| |
| - Added `?Sized` bound to benchmark parameter types, which allows dynamically sized types like |
| `&str` and `&[T]` to be used as benchmark parameters. |
| - Added the `--output-format <format>` command-line option. If `--output-format bencher` is passed, |
| Criterion.rs will print its measurements in a format similar to that used by the `bencher` crate |
| or unstable `libtest` benchmarks, and using similar statistical measurements as well. Though this |
| provides less information than the default format, it may be useful for supporting tools which |
| parse this output format. |
| - Added `--nocapture` argument. This argument does nothing, but prevents Criterion.rs from exiting |
| when running tests or benchmarks and allowing stdout output from other tests. |
| |
| ### Fixed |
| |
| - Fixed panic when environment variables contains non-UTF8 characters. |
| - Fixed panic when `CRITERION_DEBUG` or `CRITERION_TARGET_DIR` environment variables contain |
| non-UTF8 characters. |
| |
| ## [0.3.1] - 2020-01-25 |
| |
| ### Added |
| |
| - Added new plotting backend using the `plotters` crate. Implementation generously provided by Hao |
| Hou, author of the `plotters` crate. |
| - Added `--plotting-backend` command-line option to select the plotting backend. The existing |
| gnuplot backend will be used by default when available, and the plotters backend will be used when |
| gnuplot is not available or when requested. |
| - Added `Criterion::plotting_backend()` function to configure the plotting backend in code. |
| - Added `--load-baseline` command-line option to load a baseline for comparison |
| rather than measuring the current code |
| - Benchmark filters can now be regular expressions. |
| |
| ### Fixed |
| |
| - Fixed `fibonacci` functions. |
| - Fixed `#[criterion]` benchmarks ignoring the command-line options. |
| - Fixed incorrect scaling of the violin plots. |
| - Don't print the recommended sample count if it's the same as the configured |
| sample count. |
| - Fix potential panic when `nresamples` is set too low. Also added a warning |
| against setting `nresamples` too low. |
| - Fixed issue where a slow outer closure would cause Criterion.rs to calculate |
| the wrong estimated time and number of iterations in the warm-up phase. |
| |
| ## [0.3.0] - 2019-08-25 |
| |
| ### Added |
| |
| - Added support for plugging in custom measurements (eg. processor counters) |
| into Criterion.rs' measurement and analysis. |
| - Added support for plugging in instrumentation for internal profilers such as |
| `cpuprofiler` which must be explicitly started and stopped within the profiled |
| process. |
| - Added the `BenchmarkGroup` type, which supersedes `ParameterizedBenchmark`, `Benchmark`, |
| `Criterion::bench_functions`, `Criterion::bench_function_over_inputs`, and `Criterion::bench`. |
| `BenchmarkGroup` performs the same function as all of the above, but is cleaner to use and more |
| powerful and flexible. All of these types/functions are now soft-deprecated (meaning they're |
| hidden from the documentation and should not be used in new code). They will be fully deprecated |
| at some point in the 0.3.\* series and removed in 0.4.0. |
| - `iter_custom` - a "timing loop" that allows the caller to perform their own measurements. This is |
| useful for complex measurements that don't fit into the usual mode of calling a lambda in a loop. |
| - If the benchmark cannot be completed in approximately the requested measurement time, |
| Criterion.rs will now print a suggested measurement time and sample size that would work. |
| - Two new fields, `throughput_num` and `throughput_type` have been added to the `raw.csv` file. |
| - Added command-line options to set the defaults for warm-up time, measurement-time, etc. |
| |
| ### Changed |
| |
| - The `raw.csv` file format has been changed slightly. The `sample_time_nanos` field has been split |
| into `sample_measured_value` and `unit` fields to accommodate custom measurements. |
| - Throughput has been expanded from u32 to u64 to accommodate very large input sizes. |
| |
| ### Fixed |
| |
| - Fixed possible invalid file name error on Windows |
| - Fixed potential case where data for two different benchmarks would be stored in the same directory. |
| |
| ### Removed |
| |
| - Removed the `--measure-only` command-line argument; it was deprecated in favor of `--profile-time` |
| in 0.2.6. |
| - External program benchmarks have been removed; they were deprecated in 0.2.6. The new |
| `iter_custom` timing loop can be used as a substitute; see `benches/external_process.rs` for an |
| example of this. |
| |
| ### Deprecated |
| |
| - The `--test` argument is now deprecated. To test benchmarks, use `cargo test --benches`. |
| |
| ## [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](https://github.com/bheisler/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` and`criterion::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. |
| |
| [Unreleased]: https://github.com/bheisler/criterion.rs/compare/0.4.0...HEAD |
| [0.1.1]: https://github.com/bheisler/criterion.rs/compare/0.1.0...0.1.1 |
| [0.1.2]: https://github.com/bheisler/criterion.rs/compare/0.1.1...0.1.2 |
| [0.2.0]: https://github.com/bheisler/criterion.rs/compare/0.1.2...0.2.0 |
| [0.2.1]: https://github.com/bheisler/criterion.rs/compare/0.2.0...0.2.1 |
| [0.2.2]: https://github.com/bheisler/criterion.rs/compare/0.2.1...0.2.2 |
| [0.2.3]: https://github.com/bheisler/criterion.rs/compare/0.2.2...0.2.3 |
| [0.2.4]: https://github.com/bheisler/criterion.rs/compare/0.2.3...0.2.4 |
| [0.2.5]: https://github.com/bheisler/criterion.rs/compare/0.2.4...0.2.5 |
| [0.2.6]: https://github.com/bheisler/criterion.rs/compare/0.2.5...0.2.6 |
| [0.2.7]: https://github.com/bheisler/criterion.rs/compare/0.2.6...0.2.7 |
| [0.2.8]: https://github.com/bheisler/criterion.rs/compare/0.2.7...0.2.8 |
| [0.2.9]: https://github.com/bheisler/criterion.rs/compare/0.2.8...0.2.9 |
| [0.2.10]: https://github.com/bheisler/criterion.rs/compare/0.2.9...0.2.10 |
| [0.2.11]: https://github.com/bheisler/criterion.rs/compare/0.2.10...0.2.11 |
| [0.3.0]: https://github.com/bheisler/criterion.rs/compare/0.2.11...0.3.0 |
| [0.3.1]: https://github.com/bheisler/criterion.rs/compare/0.3.0...0.3.1 |
| [0.3.2]: https://github.com/bheisler/criterion.rs/compare/0.3.1...0.3.2 |
| [0.3.3]: https://github.com/bheisler/criterion.rs/compare/0.3.2...0.3.3 |
| [0.3.4]: https://github.com/bheisler/criterion.rs/compare/0.3.3...0.3.4 |
| [0.3.5]: https://github.com/bheisler/criterion.rs/compare/0.3.4...0.3.5 |
| [0.3.6]: https://github.com/bheisler/criterion.rs/compare/0.3.5...0.3.6 |
| [0.4.0]: https://github.com/bheisler/criterion.rs/compare/0.3.6...0.4.0 |