Benchmarks
This directory contains performance benchmarks for the ODE solver library.
Running Benchmarks
To run all benchmarks:
cargo bench
To run a specific benchmark file:
cargo bench --bench bs3_vs_dp5
cargo bench --bench simple_1d
cargo bench --bench orbit
Benchmark Suites
bs3_vs_dp5.rs - BS3 vs DP5 Comparison
Comprehensive performance comparison between the Bogacki-Shampine 3(2) method (BS3) and Dormand-Prince 4(5) method (DP5).
Test Problems:
- Exponential Decay - Simple 1D problem:
y' = -0.5*y - Harmonic Oscillator - 2D conservative system:
y'' + y = 0 - Nonlinear Pendulum - Nonlinear 2D system with trigonometric terms
- Orbital Mechanics - 6D system with gravitational dynamics
- Interpolation - Performance of dense output interpolation
- Tolerance Scaling - How methods perform across tolerance ranges (1e-3 to 1e-7)
Expected Results:
- BS3 should be faster for moderate tolerances (1e-3 to 1e-6) on simple problems
- Lower overhead: 4 stages vs 7 stages for DP5
- FSAL property: effective cost ~3 function evaluations per step
- DP5 should be faster for tight tolerances (< 1e-7)
- Higher order allows larger steps
- Better for problems requiring high accuracy
- Interpolation: DP5 has more sophisticated interpolation, may be faster/more accurate
simple_1d.rs - Simple 1D Problem
Basic benchmark for a simple 1D exponential decay problem using DP5.
orbit.rs - Orbital Mechanics
6D orbital mechanics problem using DP5.
Benchmark Results Interpretation
Criterion outputs timing statistics for each benchmark:
- Time: Mean execution time with confidence interval
- Outliers: Number of measurements significantly different from the mean
- Plots: Stored in
target/criterion/(if gnuplot is available)
Performance Comparison
When comparing BS3 vs DP5:
-
For moderate accuracy (tol ~ 1e-5):
- BS3 typically uses ~1.5-2x the time per problem
- But this can vary by problem characteristics
-
For high accuracy (tol ~ 1e-7):
- DP5 becomes more competitive or faster
- Higher order allows fewer steps
-
Memory usage:
- BS3: Stores 4 values for dense output [y0, y1, f0, f1]
- DP5: Stores 5 values for dense output [rcont1..rcont5]
- Difference is minimal for most problems
Notes
- Benchmarks use
std::hint::black_box()to prevent compiler optimizations - Each benchmark runs multiple iterations to get statistically significant results
- Results may vary based on:
- System load
- CPU frequency scaling
- Compiler optimizations
- Problem characteristics (stiffness, nonlinearity, dimension)
Adding New Benchmarks
To add a new benchmark:
- Create a new file in
benches/(e.g.,my_benchmark.rs) - Add benchmark configuration to
Cargo.toml:[[bench]] name = "my_benchmark" harness = false - Use the Criterion framework:
use criterion::{criterion_group, criterion_main, Criterion}; use std::hint::black_box; fn my_bench(c: &mut Criterion) { c.bench_function("my_test", |b| { b.iter(|| { black_box({ // Code to benchmark }); }); }); } criterion_group!(benches, my_bench); criterion_main!(benches);