Measure a cost on a tree that does not move when layout does
`Branch` picks which of two subtrees to draw by comparing a measured pixel length with a threshold. That is exactly what the oracle wants -- it is how a widget believing a measurement a cold start would not have given it becomes a different tree -- and exactly what a rig measuring cost must not have: the fixture's shape moves with the thing being measured. It has been moving. Seed 1 at depth 8 draws 88 widgets and writes 2,298 primitives a frame at `5ed9e87`, and 115 and 8,209 at `bd6de71` -- three and a half times the work -- so the handoff's "fixed point cost 3x" compared two different workloads and is withdrawn. Measured on one tree instead, with `Edits::fixed_branches`, `5ed9e87` is 1,761M instructions and ~699M cycles against this head's 2,093M and ~819M, while drawing 100 widgets against 97 and writing 4,272 primitives against 3,951. Fixed point costs something like a fifth to a quarter, not three times. The oracle keeps measured branches: `fixed_branches` is false by default and only the rig sets it. A branch consumes its randomness either way, so both grow the same ids. **Check the work counters before comparing two commits' times.** The rig prints drawn widgets, widget draws and primitive writes for this reason; an undrawn `leftover` child still moves them, which no flag can remove. Checked: fmt, clippy, 105 tests, the 100-seed generated oracle. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4cbb242a5d
commit
394d5149a5
2 files changed
+30
-3
No files matched your search
@@ -92,9 +92,18 @@ fn trace_selected(tree: &Tree) {
|
||||
#[cfg(not(feature = "layout-diagnostics"))]
|
||||
fn trace_selected(_: &Tree) {}
|
||||
|
||||
/// The shape a cost is measured on must not depend on what layout measured,
|
||||
/// or two commits are compared on two different trees. See `Edits`.
|
||||
fn rig_edits() -> Edits {
|
||||
Edits {
|
||||
fixed_branches: true,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn warm(seed: u64, depth: usize) -> (Harness, Tree) {
|
||||
let mut harness = Harness::new(OUTPUT);
|
||||
let (root, tree) = grow(&mut harness.rsc, seed, depth, &Edits::default());
|
||||
let (root, tree) = grow(&mut harness.rsc, seed, depth, &rig_edits());
|
||||
harness.state.root = Some(root);
|
||||
harness.frame();
|
||||
println!(
|
||||
@@ -173,7 +182,7 @@ fn layout_cost() {
|
||||
|
||||
if selected("cold") {
|
||||
let mut harness = Harness::new(OUTPUT);
|
||||
let (root, tree) = grow(&mut harness.rsc, seed, depth, &Edits::default());
|
||||
let (root, tree) = grow(&mut harness.rsc, seed, depth, &rig_edits());
|
||||
harness.state.root = Some(root);
|
||||
println!(
|
||||
"fixture: seed {seed}, depth {depth}, {} widgets",
|
||||
|
||||
Reference in new issue
Block a user