use std::{
sync::Arc,
time::{Duration, Instant},
};
use gled_model::{
asset::{
project::Project,
scene::{effect::Effect, grid::GridLocation, instance::SceneInstance},
},
collection::Collections,
patching::{
fixture::{Fixture, LayoutPosition},
layout::LayoutRef,
},
};
use super::project_edits;
const FRAMES: usize = 100;
fn large_project() -> Project {
let mut project = Project::default();
project.set_grid_size(8, 6);
for index in 0..500 {
project.patch.add_fixture(
Fixture::new(format!("bar {index}")),
LayoutPosition::default(),
);
}
for _ in 0..3 {
let layout = project.patch.add_layout();
let ids: Vec<_> = project.patch.topology.fixtures.keys().copied().collect();
for id in ids {
project.patch.add_member(LayoutRef::Layout(layout), id);
}
}
for row in 0..6 {
for col in 0..8 {
let mut instance =
SceneInstance::from_scene_id(Default::default(), &Collections::default());
for _ in 0..3 {
instance.scene.effects.push(Effect::default());
}
project.add_scene_instance(GridLocation::new(col, row), instance);
}
}
project
}
fn median(mut times: Vec<Duration>) -> Duration {
times.sort();
times[times.len() / 2]
}
#[test]
#[ignore = "a measurement, not a test"]
fn project_edits_bench() {
let edited = Some(large_project());
let engine = edited.clone().map(Arc::new);
let mut confirmed = edited.clone();
let (mut edits_sent, changes, mut compared) = (false, 1_u64, 0_u64);
let frame = median(
(0..FRAMES)
.map(|_| {
let start = Instant::now();
let actions = project_edits(&confirmed, &edited, false);
if !actions.is_empty() {
confirmed = edited.clone();
edits_sent = true;
}
std::hint::black_box(actions);
let may_differ = changes != compared || edits_sent;
(compared, edits_sent) = (changes, false);
std::hint::black_box(may_differ && engine.as_deref() != confirmed.as_ref());
start.elapsed()
})
.collect(),
);
println!("project sync, nothing edited (median): {frame:?} per frame");
}