From 6b02f19624e38484b82595afcf9177e31e81ac35 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jul 2026 17:29:33 +0300 Subject: [PATCH] feat: add performance benchmarks for composite buffer pooling and effects pipeline skipping --- .~lock.hcie_features.ods# | 1 + Cargo.lock | 167 +++++++++++++++++- hcie-engine-api/Cargo.toml | 17 ++ hcie-engine-api/benches/below_cache_reuse.rs | 146 +++++++++++++++ .../benches/composite_scratch_pooling.rs | 146 +++++++++++++++ hcie-engine-api/benches/effects_skip.rs | 166 +++++++++++++++++ .../benches/stroke_mask_pooling.rs | 120 +++++++++++++ hcie_features.ods | Bin 18320 -> 60520 bytes 8 files changed, 762 insertions(+), 1 deletion(-) create mode 100644 .~lock.hcie_features.ods# create mode 100644 hcie-engine-api/benches/below_cache_reuse.rs create mode 100644 hcie-engine-api/benches/composite_scratch_pooling.rs create mode 100644 hcie-engine-api/benches/effects_skip.rs create mode 100644 hcie-engine-api/benches/stroke_mask_pooling.rs diff --git a/.~lock.hcie_features.ods# b/.~lock.hcie_features.ods# new file mode 100644 index 0000000..4885a72 --- /dev/null +++ b/.~lock.hcie_features.ods# @@ -0,0 +1 @@ +,dev-user,hc-20w1s30u2j,24.07.2026 16:44,file:///home/dev-user/.config/libreoffice/4; \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 1e4cbd4..2bb0407 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -133,6 +133,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "anstream" version = "1.0.0" @@ -759,6 +765,12 @@ dependencies = [ "wayland-client", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" version = "1.2.65" @@ -798,6 +810,58 @@ dependencies = [ "libc", ] +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + [[package]] name = "clipboard-win" version = "5.4.1" @@ -1027,6 +1091,42 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -2651,6 +2751,7 @@ name = "hcie-engine-api" version = "0.1.0" dependencies = [ "approx", + "criterion", "dirs 6.0.0", "hcie-blend", "hcie-brush-engine", @@ -3553,12 +3654,32 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -4619,6 +4740,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + [[package]] name = "openssl" version = "0.10.81" @@ -4953,6 +5080,34 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + [[package]] name = "png" version = "0.17.16" @@ -5333,7 +5488,7 @@ dependencies = [ "built", "cfg-if", "interpolate_name", - "itertools", + "itertools 0.14.0", "libc", "libfuzzer-sys", "log", @@ -6519,6 +6674,16 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tinyvec" version = "1.11.0" diff --git a/hcie-engine-api/Cargo.toml b/hcie-engine-api/Cargo.toml index b40b3a4..d8a911d 100644 --- a/hcie-engine-api/Cargo.toml +++ b/hcie-engine-api/Cargo.toml @@ -40,3 +40,20 @@ rstest = "0.23" proptest = "1.5" approx = "0.5" sha2 = "0.10" +criterion = { version = "0.5", features = ["html_reports"] } + +[[bench]] +name = "stroke_mask_pooling" +harness = false + +[[bench]] +name = "composite_scratch_pooling" +harness = false + +[[bench]] +name = "below_cache_reuse" +harness = false + +[[bench]] +name = "effects_skip" +harness = false diff --git a/hcie-engine-api/benches/below_cache_reuse.rs b/hcie-engine-api/benches/below_cache_reuse.rs new file mode 100644 index 0000000..7ee9a25 --- /dev/null +++ b/hcie-engine-api/benches/below_cache_reuse.rs @@ -0,0 +1,146 @@ +//! Criterion benchmark: `below_cache` reuse across consecutive strokes. +//! +//! ## Purpose +//! Verifies that painting multiple strokes on the **same layer** reuses the +//! pre-built `below_cache` (composite of all layers below the active one) +//! instead of rebuilding it from scratch on every `begin_stroke()`. +//! +//! On a 4K 10-layer document the below-layer composite costs ~15–25 ms. +//! If `below_cache_dirty` is incorrectly set to `true` after every +//! `end_stroke()`, each subsequent stroke pays that cost again. +//! +//! ## Logic & Workflow +//! 1. Creates a 3840×2160, 10-layer document (all filled). +//! 2. **first_stroke**: Benchmarks a full stroke including below_cache build. +//! 3. **second_stroke_same_layer**: Benchmarks a stroke on the same layer +//! where `below_cache` should be reused (much cheaper `begin_stroke`). +//! +//! When the cache works correctly, the second stroke's `begin_stroke()` is +//! essentially free (just a dirty-flag check), while the first one must +//! composite 9 below-layers into a 33 MB buffer. +//! +//! ## Arguments & Returns +//! Standard criterion benchmark — run with: +//! ```bash +//! cargo bench -p hcie-engine-api --bench below_cache_reuse +//! ``` +//! +//! ## Side Effects / Dependencies +//! Allocates ~400 MB (10 layers × 4K RGBA + below_cache + composite_scratch). + +use criterion::{criterion_group, criterion_main, Criterion}; +use hcie_engine_api::{BrushStyle, BrushTip, Engine}; + +/// Canvas dimensions — 4K UHD. +const W: u32 = 3840; +const H: u32 = 2160; +/// Number of raster layers. +const LAYERS: usize = 10; + +/// Builds a 10-layer 4K document. The top layer is the active drawing target. +/// +/// **Purpose:** Creates a worst-case scenario where the below-layer composite +/// is expensive (9 filled layers below the active one). +/// **Returns:** `(Engine, top_layer_id)`. +fn setup_10layer_engine() -> (Engine, u64) { + let mut engine = Engine::new(W, H); + + let bg_id = engine.active_layer_id(); + engine.set_active_layer(bg_id); + engine.draw_filled_rect_rgba(0, 0, W, H, [240, 240, 240, 255]); + + let mut layer_ids = vec![bg_id]; + for i in 1..LAYERS { + let id = engine.add_layer(&format!("Layer {}", i)); + engine.set_active_layer(id); + let color = match i % 4 { + 0 => [180, 80, 80, 255], + 1 => [80, 180, 80, 255], + 2 => [80, 80, 180, 255], + _ => [160, 140, 100, 255], + }; + engine.draw_filled_rect_rgba(0, 0, W, H, color); + layer_ids.push(id); + } + + let top_id = *layer_ids.last().unwrap(); + engine.set_active_layer(top_id); + + let mut tip = BrushTip::default(); + tip.style = BrushStyle::Round; + tip.size = 24.0; + tip.opacity = 1.0; + tip.hardness = 0.85; + tip.spacing = 0.1; + engine.set_brush_tip(tip); + engine.set_color([220, 60, 60, 255]); + engine.set_eraser(false); + + (engine, top_id) +} + +/// Performs a short stroke: begin → 5 segments → composite → end. +/// +/// **Purpose:** Exercises the full `begin_stroke()` (below_cache build/reuse) +/// through `end_stroke()` lifecycle. +/// **Arguments:** `engine` — mutable engine, `layer_id` — target layer, +/// `offset` — slight position offset to avoid degenerate repeat painting. +/// **Side Effects:** Mutates layer pixels, triggers composite, commits history. +fn do_stroke(engine: &mut Engine, layer_id: u64, offset: f32) { + let cx = W as f32 / 2.0 + offset; + let cy = H as f32 / 2.0 + offset; + engine.begin_stroke(layer_id, cx, cy); + for i in 1..=5 { + let d = i as f32 * 8.0; + engine.stroke_to(layer_id, cx + d, cy + d, 0.8); + } + let (_region, ptr, _size) = engine.render_composite_region(); + assert!(!ptr.is_null()); + engine.end_stroke(layer_id); + std::thread::sleep(std::time::Duration::from_millis(10)); + engine.commit_pending_history(); +} + +/// Benchmark group: below_cache build (first stroke) vs reuse (second stroke). +/// +/// **Purpose:** Detects regressions where `below_cache_dirty` is incorrectly +/// set to `true` in `end_stroke()` or where `below_cache` is dropped to `None`, +/// forcing a full 9-layer re-composite on every stroke. +/// +/// **Logic & Workflow:** +/// - `first_stroke_cache_build`: On a fresh engine, `begin_stroke()` must +/// build the below_cache from scratch (composite 9 layers → 33 MB buffer). +/// - `second_stroke_cache_reuse`: After the first stroke on the same layer, +/// `begin_stroke()` should find `below_cache_dirty == false` and +/// `below_cache_active_idx == current`, skipping the entire composite. +fn bench_below_cache_reuse(c: &mut Criterion) { + let mut group = c.benchmark_group("below_cache_reuse"); + + // ── First stroke: cache must be built from scratch ── + group.bench_function("first_stroke_cache_build", |b| { + b.iter_with_setup( + || setup_10layer_engine(), + |(mut engine, layer_id)| { + do_stroke(&mut engine, layer_id, 0.0); + }, + ); + }); + + // ── Second stroke on same layer: cache should be reused ── + group.bench_function("second_stroke_cache_reuse", |b| { + let (mut engine, layer_id) = setup_10layer_engine(); + // Build the cache with the first stroke + do_stroke(&mut engine, layer_id, 0.0); + + let mut offset = 0.0_f32; + b.iter(|| { + offset += 5.0; + do_stroke(&mut engine, layer_id, offset); + }); + }); + + group.finish(); +} + +criterion_group!(benches, bench_below_cache_reuse); +criterion_main!(benches); diff --git a/hcie-engine-api/benches/composite_scratch_pooling.rs b/hcie-engine-api/benches/composite_scratch_pooling.rs new file mode 100644 index 0000000..fbb8bb8 --- /dev/null +++ b/hcie-engine-api/benches/composite_scratch_pooling.rs @@ -0,0 +1,146 @@ +//! Criterion benchmark: `composite_scratch` buffer pooling guard. +//! +//! ## Purpose +//! Verifies that the ~33 MB `composite_scratch` buffer inside +//! `render_composite_region()` is allocated once and reused across calls. +//! If a regression replaces the pooled `Option>` with a fresh +//! `Vec::new()` on every call, this benchmark detects the allocation storm. +//! +//! ## Logic & Workflow +//! 1. Creates a 3840×2160, 10-layer document with all layers filled. +//! 2. Performs a stroke + composite to warm the scratch buffer. +//! 3. **cold_composite**: Measures a `render_composite_region()` call on a +//! fresh engine where `composite_scratch` is `None`. +//! 4. **warm_composite**: Measures the same call after the buffer has been +//! allocated (should be faster — no allocation, just memset + composite). +//! +//! ## Arguments & Returns +//! Standard criterion benchmark — run with: +//! ```bash +//! cargo bench -p hcie-engine-api --bench composite_scratch_pooling +//! ``` +//! +//! ## Side Effects / Dependencies +//! Allocates ~400 MB (10 layers × 4K RGBA + scratch + tile caches). + +use criterion::{criterion_group, criterion_main, Criterion}; +use hcie_engine_api::{BrushStyle, BrushTip, Engine}; + +/// Canvas dimensions — 4K UHD. +const W: u32 = 3840; +const H: u32 = 2160; +/// Number of raster layers to create (worst-case workload). +const LAYERS: usize = 10; + +/// Builds a multi-layer 4K document ready for compositing. +/// +/// **Purpose:** Creates the worst-case composite scenario with every layer +/// filled so tile and pixel compositing operate on real data. +/// **Returns:** `(Engine, top_layer_id)`. +fn setup_multilayer_engine() -> (Engine, u64) { + let mut engine = Engine::new(W, H); + + let bg_id = engine.active_layer_id(); + engine.set_active_layer(bg_id); + engine.draw_filled_rect_rgba(0, 0, W, H, [240, 240, 240, 255]); + + let mut layer_ids = vec![bg_id]; + for i in 1..LAYERS { + let id = engine.add_layer(&format!("Layer {}", i)); + engine.set_active_layer(id); + let color = match i % 4 { + 0 => [180, 80, 80, 255], + 1 => [80, 180, 80, 255], + 2 => [80, 80, 180, 255], + _ => [160, 140, 100, 255], + }; + engine.draw_filled_rect_rgba(0, 0, W, H, color); + layer_ids.push(id); + } + + let top_id = *layer_ids.last().unwrap(); + engine.set_active_layer(top_id); + + let mut tip = BrushTip::default(); + tip.style = BrushStyle::Round; + tip.size = 24.0; + tip.opacity = 1.0; + tip.hardness = 0.85; + tip.spacing = 0.1; + engine.set_brush_tip(tip); + engine.set_color([220, 60, 60, 255]); + engine.set_eraser(false); + + (engine, top_id) +} + +/// Forces a dirty region and composites it. +/// +/// **Purpose:** Exercises the `render_composite_region()` path including +/// scratch buffer allocation/reuse, tile compositing, and dirty rect handling. +/// **Arguments:** `engine` — mutable engine, `layer_id` — target layer. +/// **Side Effects:** Paints a short stroke segment to create a dirty region, +/// then calls `render_composite_region()`. +fn stroke_and_composite(engine: &mut Engine, layer_id: u64) { + let cx = W as f32 / 2.0; + let cy = H as f32 / 2.0; + engine.begin_stroke(layer_id, cx, cy); + engine.stroke_to(layer_id, cx + 50.0, cy + 50.0, 0.8); + let (region, ptr, _size) = engine.render_composite_region(); + assert!(!ptr.is_null()); + let _ = region; + engine.end_stroke(layer_id); + std::thread::sleep(std::time::Duration::from_millis(10)); + engine.commit_pending_history(); +} + +/// Benchmark group: cold vs warm `composite_scratch` allocation. +/// +/// **Purpose:** Detects regressions where `composite_scratch` is dropped or +/// reallocated on every `render_composite_region()` call. When pooling works, +/// the warm benchmark avoids a ~33 MB allocation and should be measurably faster. +/// +/// **Logic & Workflow:** +/// - `cold_composite`: Fresh engine, `composite_scratch = None`. First call +/// allocates the buffer. +/// - `warm_composite`: Engine with pre-allocated scratch buffer. Measures +/// pure composite cost without allocation overhead. +fn bench_composite_scratch_pooling(c: &mut Criterion) { + let mut group = c.benchmark_group("composite_scratch_pooling"); + + // ── Cold: composite on a fresh engine (scratch allocation included) ── + group.bench_function("cold_composite", |b| { + b.iter_with_setup( + || setup_multilayer_engine(), + |(mut engine, layer_id)| { + stroke_and_composite(&mut engine, layer_id); + }, + ); + }); + + // ── Warm: composite on a pre-warmed engine (scratch already pooled) ── + group.bench_function("warm_composite", |b| { + let (mut engine, layer_id) = setup_multilayer_engine(); + // Warm up: allocate the scratch buffer + stroke_and_composite(&mut engine, layer_id); + + b.iter(|| { + // Paint a new segment and composite — scratch should be reused + let cx = W as f32 / 2.0; + let cy = H as f32 / 2.0; + engine.begin_stroke(layer_id, cx, cy); + engine.stroke_to(layer_id, cx + 30.0, cy - 30.0, 0.7); + let (region, ptr, _size) = engine.render_composite_region(); + assert!(!ptr.is_null()); + let _ = region; + engine.end_stroke(layer_id); + std::thread::sleep(std::time::Duration::from_millis(5)); + engine.commit_pending_history(); + }); + }); + + group.finish(); +} + +criterion_group!(benches, bench_composite_scratch_pooling); +criterion_main!(benches); diff --git a/hcie-engine-api/benches/effects_skip.rs b/hcie-engine-api/benches/effects_skip.rs new file mode 100644 index 0000000..fae7203 --- /dev/null +++ b/hcie-engine-api/benches/effects_skip.rs @@ -0,0 +1,166 @@ +//! Criterion benchmark: conditional `effects_dirty` skip guard. +//! +//! ## Purpose +//! Verifies that `render_composite_region()` / `apply_effects_and_sync_tiles()` +//! skips the expensive effects pipeline for layers that have **no effects or +//! styles**. If a regression removes the `effects.is_empty() && styles.is_empty()` +//! early-exit or unconditionally sets `effects_dirty = true`, composite cost +//! on effect-free documents will increase dramatically. +//! +//! ## Logic & Workflow +//! 1. Creates a 3840×2160, 10-layer document (all filled, no effects). +//! 2. **no_effects**: Benchmarks `render_composite_region()` where every layer +//! has empty `effects` and `styles` vectors → the effects pipeline is +//! completely skipped. +//! 3. **with_one_effect**: Same document but one layer has a DropShadow style +//! → the effects pipeline runs for that single layer. +//! +//! When the conditional skip works, `no_effects` should be measurably faster +//! than `with_one_effect` because no `apply_layer_effects` calls are made. +//! +//! ## Arguments & Returns +//! Standard criterion benchmark — run with: +//! ```bash +//! cargo bench -p hcie-engine-api --bench effects_skip +//! ``` +//! +//! ## Side Effects / Dependencies +//! Allocates ~400 MB (10 layers × 4K RGBA + composite buffers). + +use criterion::{criterion_group, criterion_main, Criterion}; +use hcie_engine_api::{BrushStyle, BrushTip, Engine, LayerStyle}; + +/// Canvas dimensions — 4K UHD. +const W: u32 = 3840; +const H: u32 = 2160; +/// Number of raster layers. +const LAYERS: usize = 10; + +/// Builds a 10-layer 4K document with NO effects on any layer. +/// +/// **Purpose:** Creates the baseline scenario where the effects pipeline +/// should be completely skipped during compositing. +/// **Returns:** `(Engine, top_layer_id, all_layer_ids)`. +fn setup_no_effects_engine() -> (Engine, u64, Vec) { + let mut engine = Engine::new(W, H); + + let bg_id = engine.active_layer_id(); + engine.set_active_layer(bg_id); + engine.draw_filled_rect_rgba(0, 0, W, H, [240, 240, 240, 255]); + + let mut layer_ids = vec![bg_id]; + for i in 1..LAYERS { + let id = engine.add_layer(&format!("Layer {}", i)); + engine.set_active_layer(id); + let color = match i % 4 { + 0 => [180, 80, 80, 255], + 1 => [80, 180, 80, 255], + 2 => [80, 80, 180, 255], + _ => [160, 140, 100, 255], + }; + engine.draw_filled_rect_rgba(0, 0, W, H, color); + layer_ids.push(id); + } + + let top_id = *layer_ids.last().unwrap(); + engine.set_active_layer(top_id); + + let mut tip = BrushTip::default(); + tip.style = BrushStyle::Round; + tip.size = 24.0; + tip.opacity = 1.0; + tip.hardness = 0.85; + tip.spacing = 0.1; + engine.set_brush_tip(tip); + engine.set_color([220, 60, 60, 255]); + engine.set_eraser(false); + + (engine, top_id, layer_ids) +} + +/// Performs a stroke + composite cycle and returns. +/// +/// **Purpose:** Creates a dirty region and composites it, exercising the +/// effects pipeline path. +/// **Arguments:** `engine` — mutable engine, `layer_id` — target layer, +/// `offset` — position variation. +/// **Side Effects:** Mutates layer pixels, triggers composite. +fn stroke_and_composite(engine: &mut Engine, layer_id: u64, offset: f32) { + let cx = W as f32 / 2.0 + offset; + let cy = H as f32 / 2.0 + offset; + engine.begin_stroke(layer_id, cx, cy); + for i in 1..=5 { + let d = i as f32 * 8.0; + engine.stroke_to(layer_id, cx + d, cy + d, 0.8); + } + let (_region, ptr, _size) = engine.render_composite_region(); + assert!(!ptr.is_null()); + engine.end_stroke(layer_id); + std::thread::sleep(std::time::Duration::from_millis(10)); + engine.commit_pending_history(); +} + +/// Benchmark group: effects-free composite vs single-effect composite. +/// +/// **Purpose:** Detects regressions where the effects pipeline runs +/// unnecessarily on layers with no effects, causing wasted CPU cycles +/// (apply_layer_effects + 33 MB buffer clone per affected layer). +/// +/// **Logic & Workflow:** +/// - `no_effects_composite`: All 10 layers have empty effects/styles. +/// `apply_effects_and_sync_tiles()` should skip the effects pass entirely. +/// - `with_one_dropshadow`: Layer 5 has a DropShadow style enabled. +/// The effects pipeline runs for that single layer but skips the other 9. +/// This should be slightly slower than `no_effects_composite` but not 10× +/// slower (which would indicate the skip logic is broken). +fn bench_effects_skip(c: &mut Criterion) { + let mut group = c.benchmark_group("effects_skip"); + + // ── No effects on any layer ── + group.bench_function("no_effects_composite", |b| { + let (mut engine, layer_id, _ids) = setup_no_effects_engine(); + // Warm up composite scratch + stroke_and_composite(&mut engine, layer_id, 0.0); + + let mut offset = 0.0_f32; + b.iter(|| { + offset += 3.0; + stroke_and_composite(&mut engine, layer_id, offset); + }); + }); + + // ── One layer has a DropShadow effect ── + group.bench_function("with_one_dropshadow", |b| { + let (mut engine, layer_id, layer_ids) = setup_no_effects_engine(); + + // Add a DropShadow style to layer 5 (middle of the stack) + let target_layer_id = layer_ids[5]; + engine.update_layer_style( + target_layer_id, + LayerStyle::DropShadow { + enabled: true, + opacity: 0.6, + angle: 135.0, + distance: 5.0, + spread: 0.0, + size: 10.0, + color: [0, 0, 0, 255], + blend_mode: hcie_engine_api::BlendMode::Normal, + }, + ); + + // Warm up + stroke_and_composite(&mut engine, layer_id, 0.0); + + let mut offset = 0.0_f32; + b.iter(|| { + offset += 3.0; + stroke_and_composite(&mut engine, layer_id, offset); + }); + }); + + group.finish(); +} + +criterion_group!(benches, bench_effects_skip); +criterion_main!(benches); diff --git a/hcie-engine-api/benches/stroke_mask_pooling.rs b/hcie-engine-api/benches/stroke_mask_pooling.rs new file mode 100644 index 0000000..2808d91 --- /dev/null +++ b/hcie-engine-api/benches/stroke_mask_pooling.rs @@ -0,0 +1,120 @@ +//! Criterion benchmark: `active_stroke_mask` buffer pooling guard. +//! +//! ## Purpose +//! Verifies that the `active_stroke_mask` (~8 MB on a 4K canvas) is **pooled** +//! across consecutive strokes rather than re-allocated on every +//! `begin_stroke()` / `end_stroke()` cycle. If a regression drops the mask +//! with `self.active_stroke_mask = None` inside `end_stroke()`, this benchmark +//! will show a measurable increase in allocation overhead. +//! +//! ## Logic & Workflow +//! 1. Creates a 3840×2160 document with one raster layer. +//! 2. **cold** group: a single begin/end stroke pair (first allocation). +//! 3. **warm** group: the 10th consecutive stroke on the same engine (buffer +//! should already be allocated and simply zeroed with `fill(0)`). +//! +//! When pooling works correctly, the warm benchmark should be significantly +//! faster than the cold one because no allocation occurs — only a memset. +//! +//! ## Arguments & Returns +//! Standard criterion benchmark — run with: +//! ```bash +//! cargo bench -p hcie-engine-api --bench stroke_mask_pooling +//! ``` +//! +//! ## Side Effects / Dependencies +//! Allocates ~140 MB (4K RGBA layer + mask + before buffer). Uses +//! `criterion::Criterion` for statistical measurement. + +use criterion::{criterion_group, criterion_main, Criterion}; +use hcie_engine_api::{BrushStyle, BrushTip, Engine}; + +/// Canvas dimensions — 4K UHD as requested. +const W: u32 = 3840; +const H: u32 = 2160; + +/// Creates a pre-configured engine with a filled background layer and a +/// standard round brush tip. +/// +/// **Purpose:** Shared setup for all mask pooling benchmark variants. +/// **Returns:** `(Engine, layer_id)` ready for `begin_stroke()`. +fn setup_engine() -> (Engine, u64) { + let mut engine = Engine::new(W, H); + let layer_id = engine.active_layer_id(); + engine.set_active_layer(layer_id); + engine.draw_filled_rect_rgba(0, 0, W, H, [200, 200, 200, 255]); + + let mut tip = BrushTip::default(); + tip.style = BrushStyle::Round; + tip.size = 24.0; + tip.opacity = 1.0; + tip.hardness = 0.85; + tip.spacing = 0.1; + engine.set_brush_tip(tip); + engine.set_color([60, 60, 220, 255]); + engine.set_eraser(false); + + (engine, layer_id) +} + +/// Performs a single begin_stroke → short paint → end_stroke cycle. +/// +/// **Purpose:** Exercises the full mask allocation / reuse path. +/// **Arguments:** `engine` — mutable engine reference, `layer_id` — target layer. +/// **Side Effects:** Mutates layer pixels and engine caches. +fn do_one_stroke(engine: &mut Engine, layer_id: u64) { + let cx = W as f32 / 2.0; + let cy = H as f32 / 2.0; + engine.begin_stroke(layer_id, cx, cy); + // Paint 5 short segments to exercise the mask + for i in 1..=5 { + let offset = i as f32 * 10.0; + engine.stroke_to(layer_id, cx + offset, cy + offset, 0.8); + } + engine.end_stroke(layer_id); + // Commit pending history so background thread completes + std::thread::sleep(std::time::Duration::from_millis(10)); + engine.commit_pending_history(); +} + +/// Benchmark group: cold vs warm `active_stroke_mask` allocation. +/// +/// **Purpose:** Detects pooling regressions by comparing the first stroke +/// (cold allocation) against a subsequent stroke (warm / reused buffer). +/// +/// **Logic & Workflow:** +/// - `cold_first_stroke`: Measures `begin_stroke` + short paint + `end_stroke` +/// on a fresh engine where `active_stroke_mask` is `None`. +/// - `warm_10th_stroke`: Same operation but after 9 warm-up strokes have already +/// populated the pooled mask buffer. If pooling works, this should be faster. +fn bench_mask_pooling(c: &mut Criterion) { + let mut group = c.benchmark_group("stroke_mask_pooling"); + + // ── Cold: first stroke on a fresh engine (allocation happens) ── + group.bench_function("cold_first_stroke", |b| { + b.iter_with_setup( + || setup_engine(), + |(mut engine, layer_id)| { + do_one_stroke(&mut engine, layer_id); + }, + ); + }); + + // ── Warm: 10th stroke on a warmed-up engine (buffer reuse) ── + group.bench_function("warm_10th_stroke", |b| { + // Pre-warm the engine outside the measured loop + let (mut engine, layer_id) = setup_engine(); + for _ in 0..9 { + do_one_stroke(&mut engine, layer_id); + } + + b.iter(|| { + do_one_stroke(&mut engine, layer_id); + }); + }); + + group.finish(); +} + +criterion_group!(benches, bench_mask_pooling); +criterion_main!(benches); diff --git a/hcie_features.ods b/hcie_features.ods index 7efd0d64b59db9c0c58d493bd7da47a212174caf..cdd8f1ec62dcaef95c232b5914e6e8c4aebe71f5 100644 GIT binary patch literal 60520 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 a`v*5oNe%(=?~f?Z7XkG8e){uw^nU;u%NC#j literal 18320 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 U7*7|F%-5u}MB60xnd8^!-(Hv0yZ`_I