IRIS_TODO.md's "Benchmarks" item: a message list of N wrapped-text rows (first-frame cost), scrolling it, and growing an input box above which the list must move rather than re-layout -- all as a plain, harness=false `cargo bench` binary (iris/benches/message_list.rs) since UiRenderState touches no GPU or window, chosen over criterion because every scenario here reduces to a count take_counters already answers exactly, and a new dependency wasn't worth it. Scroll (200 ticks) and the input-grow case (40 lines) are flat across N=100/1,000/10,000: LAYOUT.md's O(1) move chain holds. The many-images case (d) needs a real wgpu device, so it's a headless example (iris/examples/bench_images.rs) plus a new GpuTextures/UiRenderNode counter, take_image_bind_group_creates, mirroring take_counters. It found two real non-O(1) costs, recorded as new Fix items rather than redesigned: bind-group creation takes two frames to settle after a cold load instead of one, and appending a single image to an already-loaded 1,000-image list rebuilds all 1,000 existing bind groups (masks/move_offsets buffer growth triggers rebuild_image_bind_groups unconditionally). run-bench.sh wraps both. Numbers and commands are in IRIS_TODO.md. cargo fmt --all -- --check, cargo clippy --all-targets, and cargo test --workspace (19 passed) all clean; benches are not run by cargo test. Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
25 lines
891 B
Bash
Executable File
25 lines
891 B
Bash
Executable File
#!/bin/sh
|
|
# Runs iris's on-demand benchmark suite (IRIS_TODO.md's "Benchmarks" item).
|
|
# Never run by `cargo test`; run this by hand or before/after a layout
|
|
# change. Always release -- see AGENTS.md's own rule against reading a
|
|
# frame time from a debug build.
|
|
#
|
|
# ./run-bench.sh # everything
|
|
# ./run-bench.sh list # just the CPU-only message-list scenarios
|
|
# ./run-bench.sh images # just the GPU bind-group-creation scenario
|
|
set -eu
|
|
here=$(cd "$(dirname "$0")" && pwd)
|
|
cd "$here"
|
|
|
|
what="${1:-all}"
|
|
|
|
if [ "$what" = "all" ] || [ "$what" = "list" ]; then
|
|
echo "=== message_list (CPU-only, no window) ==="
|
|
cargo bench --bench message_list
|
|
fi
|
|
|
|
if [ "$what" = "all" ] || [ "$what" = "images" ]; then
|
|
echo "=== bench_images (real wgpu device, via run-headless.sh) ==="
|
|
timeout 60 ./run-headless.sh bench_images --seconds 4 2>&1 | grep "^BENCH_IMAGES"
|
|
fi
|