Rust is a systems programming language that focuses on safety, speed, and concurrency. It is becoming increasingly popular due to its performance characteristics and memory safety guarantees. One of the key aspects of writing efficient Rust code is to measure and optimize performance. In this article, we’ll explore how to use Rust’s benchmarking framework for performance testing.
While Rust’s standard library does not include built-in benchmarking functionality, a popular and powerful library called Criterion.rs is available for this purpose. Criterion.rs is a statistics-driven benchmarking library that provides a robust and easy-to-use interface for performance testing. It is designed to be extensible and configurable, allowing you to obtain accurate and reliable results.
To get started, add the following dependencies to your Cargo.toml
file:
[dependencies]
criterion = "0.3"
[[bench]]
name = "my_benchmark"
harness = false
This will add Criterion as a dependency and specify that we’re using it as the benchmark harness.
To create a benchmark, you need to write a Rust function that takes a mutable reference to a Criterion
object. This object provides the methods needed to configure and run benchmarks. Save the following code in a file called my_benchmark.rs
inside the benches
directory of your project:
use criterion::{black_box, Criterion};
use my_lib::my_function;
pub fn my_benchmark(c: &mut Criterion) {
c.bench_function("my_function", |b| b.iter(|| my_function(black_box(42))));
}
criterion_group!(benches, my_benchmark);
criterion_main!(benches);
In this example, we’re benchmarking the my_function
function from the my_lib
library. The black_box
function is used to prevent the compiler from optimizing away the function call, ensuring that the benchmark accurately measures its performance.
The criterion_group!
macro is used to define a group of benchmarks that will be run together. This allows you to organize your benchmarks and run them in parallel. The criterion_main!
macro generates the main
function that runs the specified benchmark groups.
To run your benchmark, simply execute the following command in your project’s root directory:
cargo bench
Criterion.rs will compile your code in release mode and run the benchmarks, producing output similar to the following:
my_function time: [25.342 ns 25.581 ns 25.845 ns]
change: [-0.8184% +0.7545% +2.1880%] (p = 0.32 > 0.05)
No change in performance detected.
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) high mild
2 (2.00%) high severe
This output provides information about the time taken for each iteration of the benchmark and whether there was a statistically significant performance change. Criterion.rs also detects and reports outliers, which can help you identify unstable benchmarks.
Criterion.rs offers advanced benchmarking features, such as:
Parameterized benchmarks: You can test your functions with different input values by using the bench_with_input
method.
Throughput measurement: You can measure the throughput of your functions in terms of bytes processed per second using the throughput
method.
Custom comparison functions: You can define custom comparison functions to control how Criterion.rs determines whether a performance change is significant.
Plotting: Criterion.rs can generate detailed performance plots to help you visualize the results of your benchmarks.
For more information on these features and how to use them, consult the Criterion.rs documentation.
Performance testing is a crucial aspect of writing efficient Rust code. Criterion.rs is a powerful library that makes benchmarking Rust code easy, accurate, and reliable. By using Criterion.rs in your project, you can ensure that your code meets your performance requirements and continue to optimize it over time.