#![allow(
unused_crate_dependencies,
missing_docs,
reason = "Benchmarks don't use all dev-dependencies"
)]
use std::{
hint::black_box,
num::NonZeroU16,
};
use criterion::{
BenchmarkId,
Criterion,
Throughput,
criterion_group,
criterion_main,
};
use lfest::{
prelude::*,
test_fee_maker,
};
use rand::{
RngExt,
SeedableRng,
};
fn criterion_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("OrderBook");
let mut rng = rand::rngs::SmallRng::seed_from_u64(0);
for n in 1..100 {
group.throughput(Throughput::Elements(n));
group.bench_with_input(BenchmarkId::new("try_insert_order", n), &n, |b, _| {
let orders = Vec::from_iter((0..n).map(|i| {
let meta = ExchangeOrderMeta::new(i.into(), (i as i64).into());
let order = LimitOrder::new(
Side::Buy,
QuoteCurrency::<i64, 5>::new(rng.random_range(50..200), 0),
BaseCurrency::new(rng.random_range(1..100), 2),
)
.unwrap();
order.into_pending(meta)
}));
b.iter_with_setup(
|| {
Account::new(
Balances::new(QuoteCurrency::new(1000, 0)),
NonZeroU16::new(n as u16).unwrap(),
const_decimal::Decimal::ONE,
*test_fee_maker().as_ref(),
)
},
|mut ob| {
for order in orders.iter() {
ob.try_insert_order(black_box(order.clone()))
.expect("Can insert");
}
},
)
});
}
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);