#[cfg(not(target_arch = "wasm32"))]
use criterion::{criterion_group, criterion_main, Criterion};
#[cfg(not(target_arch = "wasm32"))]
use rust_widgets::app::CheckBoxHandle;
#[cfg(not(target_arch = "wasm32"))]
use rust_widgets::core::Rect;
#[cfg(not(target_arch = "wasm32"))]
use rust_widgets::event::{Event, EventPriority, EventQueue};
#[cfg(all(not(target_arch = "wasm32"), declarative_view))]
use rust_widgets::widget::capability::CapabilityValue;
#[cfg(not(target_arch = "wasm32"))]
use rust_widgets::widget::WidgetFactory;
#[cfg(not(target_arch = "wasm32"))]
use std::hint::black_box;
#[cfg(all(not(target_arch = "wasm32"), declarative_view))]
fn sample_view_tree() -> rust_widgets::view::Node {
let rows = (0..40).map(|i| {
rust_widgets::view::Node::new("row").key(format!("row{i}")).children_of((0..5).map(|j| {
rust_widgets::view::Node::new("label")
.key(format!("cell{i}_{j}"))
.prop("text", CapabilityValue::String(format!("r{i}c{j}")))
}))
});
rust_widgets::view::Node::new("window").key("root").children_of(rows)
}
#[cfg(all(not(target_arch = "wasm32"), declarative_view))]
fn bench_view_diff_idle(c: &mut Criterion) {
let tree = sample_view_tree();
let lookup = |_: &[usize], _: usize| -> Option<rust_widgets::core::ObjectId> { Some(1) };
c.bench_function("view_diff_idle_201_nodes", |b| {
b.iter(|| black_box(rust_widgets::view::diff(&tree, &tree, &lookup)))
});
}
#[cfg(all(not(target_arch = "wasm32"), declarative_view))]
fn bench_view_diff_one_changed_leaf(c: &mut Criterion) {
let old = sample_view_tree();
let mut new = old.clone();
new.children[20].children[2]
.props
.insert("text".to_string(), CapabilityValue::String("changed".to_string()));
let lookup = |_: &[usize], _: usize| -> Option<rust_widgets::core::ObjectId> { Some(1) };
c.bench_function("view_diff_one_changed_leaf_201_nodes", |b| {
b.iter(|| black_box(rust_widgets::view::diff(&old, &new, &lookup)))
});
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_factory_new_with_defaults(c: &mut Criterion) {
c.bench_function("widget_factory_new_with_defaults", |b| {
b.iter(|| black_box(WidgetFactory::new_with_defaults()))
});
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_factory_shared(c: &mut Criterion) {
c.bench_function("widget_factory_shared", |b| b.iter(|| black_box(WidgetFactory::shared())));
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_property_read(c: &mut Criterion) {
let factory = WidgetFactory::shared();
let widget = factory
.create("slider", Rect::new(0, 0, 120, 24), "")
.expect("slider is a registered control");
c.bench_function("property_read_shared", |b| {
b.iter(|| black_box(factory.read_property(widget.as_ref(), "value")))
});
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_event_queue_batch_drain(c: &mut Criterion) {
c.bench_function("event_queue_drain_into_512", |b| {
b.iter(|| {
let queue = EventQueue::new();
let sender = queue.sender();
for i in 0..512_u64 {
sender
.post_with_priority(
i,
Event::MouseMove {
pos: rust_widgets::core::Point::new((i % 1024) as i32, 0),
},
EventPriority::Normal,
)
.expect("event post should succeed");
}
let mut high = Vec::new();
let mut normal = Vec::new();
let mut idle = Vec::new();
let moved = queue.drain_into(&mut high, &mut normal, &mut idle, 512);
black_box((moved, high.len(), normal.len(), idle.len()));
})
});
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_checkbox_set_checked(c: &mut Criterion) {
let widget = WidgetFactory::shared()
.create("checkbox", Rect::new(0, 0, 120, 24), "check")
.expect("checkbox is a registered control");
let id = rust_widgets::widget::runtime::register(widget).expect("this thread has a registry");
let handle = CheckBoxHandle::from_raw(id);
let mut checked = false;
c.bench_function("checkbox_set_checked_repeated", |b| {
b.iter(|| {
checked = !checked;
handle.set_checked(checked);
black_box(())
})
});
rust_widgets::widget::runtime::unregister(id);
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_reapply_active_theme_1000(c: &mut Criterion) {
const WIDGETS: usize = 1000;
let mut ids = Vec::with_capacity(WIDGETS);
for i in 0..WIDGETS {
let kind = if i % 2 == 0 { "button" } else { "label" };
let widget = WidgetFactory::shared()
.create(kind, Rect::new(0, 0, 120, 24), "theme")
.expect("button and label are registered controls");
if let Some(id) = rust_widgets::widget::runtime::register(widget) {
ids.push(id);
}
}
c.bench_function("reapply_active_theme_1000_widgets", |b| {
b.iter(|| {
rust_widgets::reapply_active_theme();
black_box(())
})
});
for id in ids {
rust_widgets::widget::runtime::unregister(id);
}
}
#[cfg(not(target_arch = "wasm32"))]
fn flex_fixture() -> (rust_widgets::layout::FlexLayout, Vec<rust_widgets::layout::ChildInfo>) {
use rust_widgets::layout::{ChildInfo, FlexLayout, Hints, Layout};
let mut layout = FlexLayout::new();
let children: Vec<ChildInfo> = (0..40)
.map(|i| {
let id = i as u64 + 1;
layout.add_widget(id, 0);
ChildInfo::new(id, Hints::fixed(18, 24))
})
.collect();
(layout, children)
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_flex_arrange_cached(c: &mut Criterion) {
use rust_widgets::layout::Layout;
let (layout, children) = flex_fixture();
let rect = rust_widgets::core::Rect::new(0, 0, 800, 40);
let mut scratch = Vec::with_capacity(children.len());
c.bench_function("flex_arrange_40_children_cached", |b| {
b.iter(|| {
scratch.clear();
layout.arrange(rect, &children, &mut |_, child| scratch.push(child));
black_box(scratch.len())
})
});
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_flex_arrange_uncached(c: &mut Criterion) {
use rust_widgets::layout::Layout;
let (layout, children) = flex_fixture();
let mut width = 800u32;
let mut scratch = Vec::with_capacity(children.len());
c.bench_function("flex_arrange_40_children_uncached", |b| {
b.iter(|| {
width = if width == 800 { 801 } else { 800 };
scratch.clear();
let rect = rust_widgets::core::Rect::new(0, 0, width, 40);
layout.arrange(rect, &children, &mut |_, child| scratch.push(child));
black_box(scratch.len())
})
});
}
#[cfg(not(target_arch = "wasm32"))]
fn bench_view_suite(c: &mut Criterion) {
#[cfg(declarative_view)]
{
bench_view_diff_idle(c);
bench_view_diff_one_changed_leaf(c);
}
#[cfg(not(declarative_view))]
let _ = c;
}
#[cfg(not(target_arch = "wasm32"))]
criterion_group!(
benches,
bench_factory_new_with_defaults,
bench_factory_shared,
bench_property_read,
bench_checkbox_set_checked,
bench_reapply_active_theme_1000,
bench_event_queue_batch_drain,
bench_view_suite,
bench_flex_arrange_cached,
bench_flex_arrange_uncached
);
#[cfg(not(target_arch = "wasm32"))]
criterion_main!(benches);
#[cfg(target_arch = "wasm32")]
fn main() {}