use criterion::{BenchmarkId, Criterion}; use fish::eval::Weights; use mino::srs::PieceType::*; use mino::srs::{Piece, Queue}; use mino::{mat, Mat}; static MATRIX_0: &Mat = mat! { "xxxxxxxx.x"; "xxxxxxx.xx"; "xxxx.xxxxx"; ".xxxxxxxxx"; "xxxxx.xxxx"; "xxxx.xxxxx"; "xxxxxx.xxx"; ".xxxxxxxxx"; "xxxxx.xxxx"; }; static MATRIX_1: &Mat = mat! { "...S..JJJ."; "...SSTLLJZ"; ".xxxxxxxxx"; "xxxxx.xxxx"; "xxxx.xxxxx"; "xxxxxx.xxx"; ".xxxxxxxxx"; "xxxxx.xxxx"; }; static MATRIX_2: &Mat = mat! { ".S.T......"; ".SSTT....."; "xxxxxxx.xx"; "xxxx.xxxxx"; "xx.xxxxxxx"; "x.xxxxxxxx"; "xxxxxxxxx."; "xxx.xxxxxx"; "xxxxx.xxxx"; }; static MATRIX_3: &Mat = mat! { "..OOSLL..."; ".ZOOSSLI.."; "ZZZJJSLI.."; "xxxxxxxxx."; "xxxxxxxx.x"; "xxxxxxxxx."; "xxxxxx.xxx"; "xxxxxxx.xx"; "xxxxxx.xxx"; }; static QUEUE_0: Queue<'_> = Queue::new(None, &[I, S, T, Z, L]); static QUEUE_1: Queue<'_> = Queue::new(Some(J), &[O, L, O, I, S]); static QUEUE_2: Queue<'_> = Queue::new(Some(S), &[Z, L, J, I, O]); static QUEUE_3: Queue<'_> = Queue::new(Some(L), &[S, J, T, Z, I]); static MATRIX: &[&Mat] = &[MATRIX_0, MATRIX_1, MATRIX_2, MATRIX_3]; static QUEUE: &[Queue<'_>] = &[QUEUE_0, QUEUE_1, QUEUE_2, QUEUE_3]; const ITERS: u32 = 50_000; fn think(iters: u32, weights: &Weights, matrix: &Mat, queue: Queue<'_>) -> Option { let mut bot = fish::bot::Bot::new(weights, matrix, queue); bot.think(iters); bot.suggest() } fn benchmark(c: &mut Criterion) { let mut c = c.benchmark_group("think"); c.measurement_time(std::time::Duration::from_secs(10)); for i in 0..4 { c.bench_with_input( BenchmarkId::from_parameter(i), &(ITERS, Weights::default(), MATRIX[i], QUEUE[i]), |b, (i, w, m, q)| b.iter(|| think(*i, w, m, *q)), ); } c.finish(); } criterion::criterion_group!(benches, benchmark); criterion::criterion_main!(benches);