From da69daa2194e2862d85d6e4166675f0e207a3f1a Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Thu, 16 May 2024 23:50:01 +0200 Subject: [PATCH] basic performance benchmarking --- example_rulesets/sand_stress_test.json | 1 + uscope/src/main.rs | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 example_rulesets/sand_stress_test.json diff --git a/example_rulesets/sand_stress_test.json b/example_rulesets/sand_stress_test.json new file mode 100644 index 0000000..dfb118f --- /dev/null +++ b/example_rulesets/sand_stress_test.json @@ -0,0 +1 @@ +{"rules":[{"name":"fall","base":{"width":1,"height":2,"contents":[[{"One":1},{"One":0}],[{"One":0},{"One":1}]]},"enabled":true,"flip_x":false,"flip_y":false,"rotate":false,"failrate":0},{"name":"slide","base":{"width":2,"height":2,"contents":[[{"One":1},{"One":0}],["Any","None"],[{"One":1},"None"],[{"One":0},{"One":1}]]},"enabled":true,"flip_x":true,"flip_y":false,"rotate":false,"failrate":0},{"name":"fall_out","base":{"width":1,"height":2,"contents":[[{"One":1},{"One":0}],[{"Group":0},"None"]]},"enabled":true,"flip_x":false,"flip_y":false,"rotate":false,"failrate":130},{"name":"spawn","base":{"width":1,"height":2,"contents":[[{"Group":0},"None"],[{"One":0},{"One":1}]]},"enabled":true,"flip_x":false,"flip_y":false,"rotate":false,"failrate":129}],"types":[{"name":"air","color":[0,0,0]},{"name":"pink_sand","color":[255,147,219]}],"groups":[{"name":"empty","void":true,"cells":[]}]} \ No newline at end of file diff --git a/uscope/src/main.rs b/uscope/src/main.rs index 4b66657..b160474 100644 --- a/uscope/src/main.rs +++ b/uscope/src/main.rs @@ -1,6 +1,7 @@ use std::{ fs::{self, File}, io::Write, + time::{Duration, Instant}, }; use eframe::{ @@ -31,6 +32,7 @@ struct UScope { brush: Cell, speed: u32, show_grid: bool, + sim_times: Vec, } impl UScope { @@ -40,6 +42,8 @@ impl UScope { speed: 50, show_grid: false, brush: Cell(1), + // sim_times: vec![0], + sim_times: vec![Duration::from_micros(1)], } } @@ -73,8 +77,19 @@ impl UScope { impl eframe::App for UScope { fn update(&mut self, ctx: &eframe::egui::Context, _frame: &mut eframe::Frame) { ctx.request_repaint(); + let sim_frame = Instant::now(); for _ in 0..self.speed { - self.dish.try_one_position_overlapped(); + // benchmarks made with sand_stress_test at 50000 speed in a release build + // ~50ms + // self.dish.try_one_position_overlapped(); + // ~35ms + self.dish.fire_blindly_cached(); + } + let sim_time = sim_frame.elapsed(); + // self.sim_times.push(sim_time.as_micros()); + self.sim_times.push(sim_time); + if self.sim_times.len() > 60 { + self.sim_times.remove(0); } SidePanel::left("left_panel") .min_width(100.) @@ -82,6 +97,11 @@ impl eframe::App for UScope { ui.heading("Simulation"); ui.label("speed"); ui.add(Slider::new(&mut self.speed, 0..=500).clamp_to_range(false)); + ui.label(format!("sim time: {sim_time:?}")); + let avg_sim_time = + self.sim_times.iter().sum::() / self.sim_times.len() as u32; + ui.label(format!("average sim time: {avg_sim_time:?}")); + ui.checkbox(&mut self.show_grid, "show grid"); if ui.button("regenerate rules and cache").clicked() { self.dish.update_all_rules();