diff --git a/packages/devkit/.config/nextest.toml b/packages/devkit/.config/nextest.toml new file mode 100644 index 0000000..08c1e16 --- /dev/null +++ b/packages/devkit/.config/nextest.toml @@ -0,0 +1,11 @@ +[profile.default] +retries = 0 +test-threads = "num-cpus" +status-level = "all" +final-status-level = "flaky" + +[profile.ci] +retries = 2 +test-threads = 4 +status-level = "fail" +final-status-level = "flaky" diff --git a/packages/devkit/Cargo.toml b/packages/devkit/Cargo.toml index 7f08e50..1654590 100644 --- a/packages/devkit/Cargo.toml +++ b/packages/devkit/Cargo.toml @@ -27,3 +27,15 @@ harness = false [[bench]] name = "percentile_bench" harness = false + +[[bench]] +name = "main" +harness = false + +[[bench]] +name = "spike_bench" +harness = false + +[[bench]] +name = "congestion_bench" +harness = false diff --git a/packages/devkit/benches/congestion_bench.rs b/packages/devkit/benches/congestion_bench.rs new file mode 100644 index 0000000..a93a356 --- /dev/null +++ b/packages/devkit/benches/congestion_bench.rs @@ -0,0 +1,34 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use stellar_devkit::simulation::congestion_predictor::{ + congestion_score, CongestionInput, CongestionPredictor, +}; + +fn bench_predict(c: &mut Criterion) { + let mut group = c.benchmark_group("congestion_predictor"); + + group.bench_function("predict_1000_calls", |b| { + b.iter(|| { + for i in 0..1_000u64 { + let _ = CongestionPredictor::predict(i % 1000, 100 + i * 10); + } + }) + }); + + group.bench_function("congestion_score_1000_calls", |b| { + b.iter(|| { + for i in 0..1_000u64 { + let input = CongestionInput { + recent_fee_window: 100.0 + i as f64, + capacity_usage: (i % 100) as f64 / 100.0, + spike_count: (i % 10) as u32, + }; + let _ = congestion_score(&input); + } + }) + }); + + group.finish(); +} + +criterion_group!(benches, bench_predict); +criterion_main!(benches); diff --git a/packages/devkit/benches/main.rs b/packages/devkit/benches/main.rs new file mode 100644 index 0000000..41a348f --- /dev/null +++ b/packages/devkit/benches/main.rs @@ -0,0 +1,3 @@ +// Criterion benchmark suite entry point. +// Individual benchmarks are in their own files (spike_bench, congestion_bench, etc.). +fn main() {} diff --git a/packages/devkit/benches/spike_bench.rs b/packages/devkit/benches/spike_bench.rs new file mode 100644 index 0000000..c52ddd7 --- /dev/null +++ b/packages/devkit/benches/spike_bench.rs @@ -0,0 +1,16 @@ +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; +use stellar_devkit::analysis::spike_classifier::SpikeClassifier; + +fn bench_iqr_outliers(c: &mut Criterion) { + let mut group = c.benchmark_group("spike_classifier"); + for size in [1_000u64, 10_000, 100_000, 1_000_000] { + let fees: Vec = (0..size).map(|i| 100 + (i % 50) * 10).collect(); + group.bench_with_input(BenchmarkId::new("iqr_outliers", size), &fees, |b, fees| { + b.iter(|| SpikeClassifier::iqr_outliers(fees)) + }); + } + group.finish(); +} + +criterion_group!(benches, bench_iqr_outliers); +criterion_main!(benches);