From 78a53b6bf615ec4bb2d360c501863616a561b492 Mon Sep 17 00:00:00 2001 From: iris-ai <4+iris-ai@noreply.localhost> Date: Mon, 14 Sep 2026 10:49:49 -0400 Subject: [PATCH] Keep the re-place load as a rig, so the next attempt is compared not argued --- tests/replace_cost.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 tests/replace_cost.rs diff --git a/tests/replace_cost.rs b/tests/replace_cost.rs new file mode 100644 index 0000000..e0dd964 --- /dev/null +++ b/tests/replace_cost.rs @@ -0,0 +1,43 @@ +//! What re-placing a subtree costs per frame, as a load for a counter rather +//! than a check. A span of 200 fixed-height rows, five primitives each, with +//! the row above them changing height every frame, so every row below is +//! offered a box the same shape somewhere else. +//! +//! cargo test --release --test replace_cost -- --ignored +//! perf stat -e instructions:u target/release/.../replace_cost-* --ignored +//! +//! Wall time is the wrong number here; see `draw_cost.rs`. Measured on +//! 2026-09-14 at 1.98M instructions per frame, against 2.38M for rewriting +//! each row's regions instead and 7.13M for redrawing them. + +use iris::harness::Harness; +use iris::prelude::*; + +const ROWS: usize = 200; +const FRAMES: usize = 200; + +#[test] +#[ignore = "measurement, not a check"] +fn replacing_rows_every_frame() { + let mut h = Harness::new((1920, 1200)); + let first = rect(Color::RED).height(40).add(&mut h.rsc); + let mut span = Span::empty(Dir::DOWN); + span.push(first.add_strong(&mut h.rsc)); + for i in 0..ROWS { + let row = ( + rect(Color::BLUE.darker(i as f32 / (ROWS * 2) as f32)), + rect(Color::GREEN).pad(2), + wtext("row").size(16).pad(2), + ) + .span(Dir::RIGHT) + .pad(4) + .height(40) + .add(&mut h.rsc); + span.push(row.add_strong(&mut h.rsc)); + } + h.set_root(span); + for i in 0..FRAMES { + h.rsc[first].y = Some(Len::abs(40.0 + (i % 2) as f32)); + h.frame(); + } +}