Spaces:
Sleeping
Sleeping
File size: 3,674 Bytes
463f868 9bd4ce5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | use engine_rust::core::logic::{GameState, ACTION_SPACE};
use engine_rust::test_helpers::load_real_db;
use std::time::{Duration, Instant};
fn main() {
println!("=== Detailed CPU Profiler (ST) ===");
let db = load_real_db();
let mut initial_state = GameState::default();
let p_main = db.members.keys().take(50).cloned().collect::<Vec<i32>>();
let energy_ids = db.energy_db.keys().take(10).cloned().collect::<Vec<i32>>();
initial_state.initialize_game(
p_main.clone(),
p_main.clone(),
energy_ids.clone(),
energy_ids.clone(),
Vec::new(),
Vec::new(),
);
initial_state.ui.silent = true;
initial_state.phase = engine_rust::core::logic::Phase::Main;
let mut clone_time = Duration::ZERO;
let mut gen_time = Duration::ZERO;
let mut step_time = Duration::ZERO;
let mut action_time = Duration::ZERO;
let mut games = 0;
let mut steps_total = 0;
let total_start = Instant::now();
let bench_duration = Duration::from_secs(10);
let mut mask = vec![false; ACTION_SPACE];
let mut rng_state = 12345u64;
while total_start.elapsed() < bench_duration {
let t_clone = Instant::now();
let mut sim = initial_state.clone();
clone_time += t_clone.elapsed();
let mut steps = 0;
while !sim.is_terminal() && steps < 1000 {
// Action Generation
let t_gen = Instant::now();
mask.fill(false);
sim.get_legal_actions_into(&db, sim.current_player as usize, &mut mask);
gen_time += t_gen.elapsed();
// Action Selection
let t_action = Instant::now();
let mut valid_actions = smallvec::SmallVec::<[i32; 64]>::new();
for (i, &b) in mask.iter().enumerate() {
if b {
valid_actions.push(i as i32);
}
}
if valid_actions.is_empty() {
break;
}
rng_state ^= rng_state << 13;
rng_state ^= rng_state >> 17;
rng_state ^= rng_state << 5;
let action = valid_actions[(rng_state as usize) % valid_actions.len()];
action_time += t_action.elapsed();
// Step
let t_step = Instant::now();
let _ = sim.step(&db, action);
step_time += t_step.elapsed();
steps += 1;
}
steps_total += steps;
games += 1;
}
let elapsed = total_start.elapsed().as_secs_f64();
println!("Elapsed: {:.2}s", elapsed);
println!("Games: {}", games);
println!("Steps: {}", steps_total);
println!("Games/sec: {:.2}", games as f64 / elapsed);
println!("Steps/sec: {:.2}", steps_total as f64 / elapsed);
println!("\n--- Breakdown ---");
println!(
"Clone Time: {:.4}s ({:.1}%)",
clone_time.as_secs_f64(),
(clone_time.as_secs_f64() / elapsed) * 100.0
);
println!(
"Gen Time: {:.4}s ({:.1}%)",
gen_time.as_secs_f64(),
(gen_time.as_secs_f64() / elapsed) * 100.0
);
println!(
"Action Time: {:.4}s ({:.1}%)",
action_time.as_secs_f64(),
(action_time.as_secs_f64() / elapsed) * 100.0
);
println!(
"Step Time: {:.4}s ({:.1}%)",
step_time.as_secs_f64(),
(step_time.as_secs_f64() / elapsed) * 100.0
);
println!(
"Other Time: {:.4}s",
elapsed - (clone_time + gen_time + action_time + step_time).as_secs_f64()
);
} |