
`ui.label("static string")` is a very common use case, and currently egui clones the string in these cases. This PR introduces a new type: ``` rust pub enum Estring { Static(&'static str), Owned(Arc<str>), } ``` which is used everywhere text is needed, with `impl Into<Estring>` in the API for e.g. `ui.label`. This reduces the number of copies drastically and speeds up the benchmark demo_with_tessellate__realistic by 17%. This hurts the ergonomics of egui a bit, and this is a breaking change. For instance, this used to work: ``` rust fn my_label(ui: &mut egui::Ui, text: &str) { ui.label(text); } ``` This must now either be changed to ``` rust fn my_label(ui: &mut egui::Ui, text: &str) { ui.label(text.to_string()); } ``` (or the argument must be changed to either `text: &'static str` or `text: String`)
109 lines
3.5 KiB
Rust
109 lines
3.5 KiB
Rust
use criterion::{criterion_group, criterion_main, Criterion};
|
|
|
|
use egui_demo_lib::LOREM_IPSUM_LONG;
|
|
|
|
pub fn criterion_benchmark(c: &mut Criterion) {
|
|
let raw_input = egui::RawInput::default();
|
|
|
|
{
|
|
let mut ctx = egui::CtxRef::default();
|
|
let mut demo_windows = egui_demo_lib::DemoWindows::default();
|
|
|
|
// The most end-to-end benchmark.
|
|
c.bench_function("demo_with_tessellate__realistic", |b| {
|
|
b.iter(|| {
|
|
ctx.begin_frame(raw_input.clone());
|
|
demo_windows.ui(&ctx);
|
|
let (_, shapes) = ctx.end_frame();
|
|
ctx.tessellate(shapes)
|
|
})
|
|
});
|
|
|
|
c.bench_function("demo_no_tessellate", |b| {
|
|
b.iter(|| {
|
|
ctx.begin_frame(raw_input.clone());
|
|
demo_windows.ui(&ctx);
|
|
ctx.end_frame()
|
|
})
|
|
});
|
|
|
|
ctx.begin_frame(raw_input.clone());
|
|
demo_windows.ui(&ctx);
|
|
let (_, shapes) = ctx.end_frame();
|
|
c.bench_function("demo_only_tessellate", |b| {
|
|
b.iter(|| ctx.tessellate(shapes.clone()))
|
|
});
|
|
}
|
|
|
|
if false {
|
|
let mut ctx = egui::CtxRef::default();
|
|
ctx.memory().set_everything_is_visible(true); // give us everything
|
|
let mut demo_windows = egui_demo_lib::DemoWindows::default();
|
|
c.bench_function("demo_full_no_tessellate", |b| {
|
|
b.iter(|| {
|
|
ctx.begin_frame(raw_input.clone());
|
|
demo_windows.ui(&ctx);
|
|
ctx.end_frame()
|
|
})
|
|
});
|
|
}
|
|
|
|
{
|
|
let mut ctx = egui::CtxRef::default();
|
|
ctx.begin_frame(raw_input);
|
|
let mut ui = egui::Ui::__test();
|
|
c.bench_function("label &str", |b| {
|
|
b.iter(|| {
|
|
ui.label("the quick brown fox jumps over the lazy dog");
|
|
})
|
|
});
|
|
c.bench_function("label String", |b| {
|
|
b.iter(|| {
|
|
ui.label("the quick brown fox jumps over the lazy dog".to_owned());
|
|
})
|
|
});
|
|
}
|
|
|
|
{
|
|
let pixels_per_point = 1.0;
|
|
let wrap_width = 512.0;
|
|
let text_style = egui::TextStyle::Body;
|
|
let color = egui::Color32::WHITE;
|
|
let fonts = egui::epaint::text::Fonts::from_definitions(
|
|
pixels_per_point,
|
|
egui::FontDefinitions::default(),
|
|
);
|
|
c.bench_function("text_layout_uncached", |b| {
|
|
b.iter(|| {
|
|
use egui::epaint::text::{layout, LayoutJob};
|
|
|
|
let job =
|
|
LayoutJob::simple(LOREM_IPSUM_LONG, egui::TextStyle::Body, color, wrap_width);
|
|
layout(&fonts, job.into())
|
|
})
|
|
});
|
|
c.bench_function("text_layout_cached", |b| {
|
|
b.iter(|| fonts.layout(LOREM_IPSUM_LONG, text_style, color, wrap_width))
|
|
});
|
|
|
|
let galley = fonts.layout(LOREM_IPSUM_LONG, text_style, color, wrap_width);
|
|
let mut tessellator = egui::epaint::Tessellator::from_options(Default::default());
|
|
let mut mesh = egui::epaint::Mesh::default();
|
|
c.bench_function("tessellate_text", |b| {
|
|
b.iter(|| {
|
|
tessellator.tessellate_text(
|
|
fonts.texture().size(),
|
|
egui::Pos2::ZERO,
|
|
&galley,
|
|
Default::default(),
|
|
None,
|
|
&mut mesh,
|
|
);
|
|
mesh.clear();
|
|
})
|
|
});
|
|
}
|
|
}
|
|
|
|
criterion_group!(benches, criterion_benchmark);
|
|
criterion_main!(benches);
|