diff --git a/benches/complex.rs b/benches/complex.rs
index 05bd3b741..79611988e 100644
--- a/benches/complex.rs
+++ b/benches/complex.rs
@@ -1,104 +1,126 @@
use criterion::{criterion_group, criterion_main, Criterion};
-fn stretch_benchmarks(c: &mut Criterion) {
- c.bench_function("deep hierarchy", |b| {
- b.iter(|| {
- let mut stretch = stretch::node::Stretch::new();
+fn build_deep_hierarchy(stretch: &mut stretch::node::Stretch) -> stretch::node::Node {
+ let node111 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
+ let node112 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
+
+ let node121 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
+ let node122 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
+
+ let node11 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node111, node112]).unwrap();
+ let node12 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node121, node122]).unwrap();
+ let node1 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node11, node12]).unwrap();
- let node111 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
- let node112 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
+ let node211 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
+ let node212 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
- let node121 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
- let node122 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
+ let node221 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
+ let node222 = stretch.new_node(
+ stretch::style::Style {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(10.0),
+ height: stretch::style::Dimension::Points(10.0),
+ },
+ ..Default::default()
+ },
+ vec![],
+ ).unwrap();
- let node11 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node111, node112]).unwrap();
- let node12 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node121, node122]).unwrap();
- let node1 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node11, node12]).unwrap();
+ let node21 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node211, node212]).unwrap();
+ let node22 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node221, node222]).unwrap();
- let node211 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
- let node212 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
+ let node2 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node21, node22]).unwrap();
+ let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node1, node2]).unwrap();
+
+ node0
+}
+
+fn stretch_benchmarks(c: &mut Criterion) {
+ c.bench_function("deep hierarchy - build", |b| {
+ b.iter(|| {
+ let mut stretch = stretch::node::Stretch::new();
+ build_deep_hierarchy(&mut stretch);
+ })
+ });
- let node221 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
- let node222 = stretch.new_node(
- stretch::style::Style {
- size: stretch::geometry::Size {
- width: stretch::style::Dimension::Points(10.0),
- height: stretch::style::Dimension::Points(10.0),
- },
- ..Default::default()
- },
- vec![],
- ).unwrap();
+ c.bench_function("deep hierarchy - single", |b| {
+ b.iter(|| {
+ let mut stretch = stretch::node::Stretch::new();
+ let root = build_deep_hierarchy(&mut stretch);
+ stretch.compute_layout(root, stretch::geometry::Size::undefined()).unwrap()
+ })
+ });
- let node21 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node211, node212]).unwrap();
- let node22 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node221, node222]).unwrap();
+ c.bench_function("deep hierarchy - relayout", |b| {
+ let mut stretch = stretch::node::Stretch::new();
+ let root = build_deep_hierarchy(&mut stretch);
- let node2 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node21, node22]).unwrap();
- let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node1, node2]).unwrap();
- stretch.compute_layout(node0, stretch::geometry::Size::undefined()).unwrap()
+ b.iter(|| {
+ stretch.mark_dirty(root);
+ stretch.compute_layout(root, stretch::geometry::Size::undefined()).unwrap()
})
});
}