chess-engine/benches/perft.rs
2025-11-20 10:20:56 +01:00

36 lines
No EOL
1.1 KiB
Rust

use chess_engine::board::Board;
use chess_engine::movegen::picker::MovePicker;
use chess_engine::movegen::legal_check::is_other_king_attacked;
use criterion::{criterion_group, criterion_main, Criterion};
fn count_legal_moves_recursive(board: &mut Board, depth: u8) -> u64 {
if depth == 0 {
return 1_u64;
}
let mut generator = MovePicker::new();
let mut leaf_nodes = 0_u64;
while let Some(mv) = generator.next(board) {
let undo_info = board.make_move(mv);
if !is_other_king_attacked(board) {
leaf_nodes += count_legal_moves_recursive(board, depth - 1);
}
board.undo_move(undo_info);
}
leaf_nodes
}
fn run_perft_benchmark(c: &mut Criterion) {
// init_zobrist() is no longer needed
let mut board = Board::from_fen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
c.bench_function("standard_perft5", |b| {
b.iter(|| {
assert_eq!(count_legal_moves_recursive(&mut board, 5), 4865609);
})
});
}
criterion_group!(benches, run_perft_benchmark);
criterion_main!(benches);