Use mimalloc for benchmarks (#7029)

`mimalloc` is a _much_ faster allocator, especially important when doing
a lot of small allocations (which egui does).

We use `mimalloc` in Rerun, and I recommend everyone to use it.

## The difference it makes

![image](https://github.com/user-attachments/assets/b22e0025-bc5e-4b3c-94e0-74ce46e86f85)
This commit is contained in:
Emil Ernerfeldt 2025-05-06 17:54:06 +02:00 committed by GitHub
parent 5bb20f511e
commit 7216d0e386
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 39 additions and 1 deletions

View File

@ -1336,6 +1336,7 @@ dependencies = [
"env_logger", "env_logger",
"image", "image",
"log", "log",
"mimalloc",
"poll-promise", "poll-promise",
"profiling", "profiling",
"puffin", "puffin",
@ -1358,6 +1359,7 @@ dependencies = [
"egui", "egui",
"egui_extras", "egui_extras",
"egui_kittest", "egui_kittest",
"mimalloc",
"rand", "rand",
"serde", "serde",
"unicode_names2", "unicode_names2",
@ -1559,6 +1561,7 @@ dependencies = [
"emath", "emath",
"epaint_default_fonts", "epaint_default_fonts",
"log", "log",
"mimalloc",
"nohash-hasher", "nohash-hasher",
"parking_lot", "parking_lot",
"profiling", "profiling",
@ -2486,6 +2489,16 @@ version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
[[package]]
name = "libmimalloc-sys"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec9d6fac27761dabcd4ee73571cdb06b7022dc99089acbe5435691edffaac0f4"
dependencies = [
"cc",
"libc",
]
[[package]] [[package]]
name = "libredox" name = "libredox"
version = "0.1.3" version = "0.1.3"
@ -2591,6 +2604,15 @@ dependencies = [
"paste", "paste",
] ]
[[package]]
name = "mimalloc"
version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "995942f432bbb4822a7e9c3faa87a695185b0d09273ba85f097b54f4e458f2af"
dependencies = [
"libmimalloc-sys",
]
[[package]] [[package]]
name = "mime" name = "mime"
version = "0.3.17" version = "0.3.17"

View File

@ -87,6 +87,7 @@ home = "0.5.9"
image = { version = "0.25", default-features = false } image = { version = "0.25", default-features = false }
kittest = { version = "0.1.0", git = "https://github.com/rerun-io/kittest", branch = "main" } kittest = { version = "0.1.0", git = "https://github.com/rerun-io/kittest", branch = "main" }
log = { version = "0.4", features = ["std"] } log = { version = "0.4", features = ["std"] }
mimalloc = "0.1.46"
nohash-hasher = "0.2" nohash-hasher = "0.2"
parking_lot = "0.12" parking_lot = "0.12"
pollster = "0.4" pollster = "0.4"

View File

@ -400,6 +400,9 @@
//! profile-with-puffin = ["profiling/profile-with-puffin"] //! profile-with-puffin = ["profiling/profile-with-puffin"]
//! ``` //! ```
//! //!
//! ## Custom allocator
//! egui apps can run significantly (~20%) faster by using a custom allocator, like [mimalloc](https://crates.io/crates/mimalloc) or [talc](https://crates.io/crates/talc).
//!
#![allow(clippy::float_cmp)] #![allow(clippy::float_cmp)]
#![allow(clippy::manual_range_contains)] #![allow(clippy::manual_range_contains)]

View File

@ -86,6 +86,7 @@ env_logger = { version = "0.10", default-features = false, features = [
"auto-color", "auto-color",
"humantime", "humantime",
] } ] }
mimalloc.workspace = true
rfd = { version = "0.15.3", optional = true } rfd = { version = "0.15.3", optional = true }
# web: # web:

View File

@ -4,6 +4,9 @@
#![allow(rustdoc::missing_crate_level_docs)] // it's an example #![allow(rustdoc::missing_crate_level_docs)] // it's an example
#![allow(clippy::never_loop)] // False positive #![allow(clippy::never_loop)] // False positive
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; // Much faster allocator, can give 20% speedups: https://github.com/emilk/egui/pull/7029
// When compiling natively: // When compiling natively:
fn main() -> eframe::Result { fn main() -> eframe::Result {
for arg in std::env::args().skip(1) { for arg in std::env::args().skip(1) {

View File

@ -56,8 +56,9 @@ serde = { workspace = true, optional = true }
[dev-dependencies] [dev-dependencies]
criterion.workspace = true criterion.workspace = true
egui_kittest = { workspace = true, features = ["wgpu", "snapshot"] }
egui = { workspace = true, features = ["default_fonts"] } egui = { workspace = true, features = ["default_fonts"] }
egui_kittest = { workspace = true, features = ["wgpu", "snapshot"] }
mimalloc.workspace = true # for benchmarks
rand = "0.9" rand = "0.9"
[[bench]] [[bench]]

View File

@ -8,6 +8,9 @@ use egui::{Button, Id, RichText, TextureId, Ui, UiBuilder, Vec2};
use egui_demo_lib::LOREM_IPSUM_LONG; use egui_demo_lib::LOREM_IPSUM_LONG;
use rand::Rng as _; use rand::Rng as _;
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; // Much faster allocator
/// Each iteration should be called in their own `Ui` with an intentional id clash, /// Each iteration should be called in their own `Ui` with an intentional id clash,
/// to prevent the Context from building a massive map of `WidgetRects` (which would slow the test, /// to prevent the Context from building a massive map of `WidgetRects` (which would slow the test,
/// causing unreliable results). /// causing unreliable results).

View File

@ -101,6 +101,7 @@ backtrace = { workspace = true, optional = true }
[dev-dependencies] [dev-dependencies]
criterion.workspace = true criterion.workspace = true
mimalloc.workspace = true
similar-asserts.workspace = true similar-asserts.workspace = true

View File

@ -5,6 +5,9 @@ use epaint::{
TessellationOptions, Tessellator, TextureAtlas, Vec2, TessellationOptions, Tessellator, TextureAtlas, Vec2,
}; };
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; // Much faster allocator
fn single_dashed_lines(c: &mut Criterion) { fn single_dashed_lines(c: &mut Criterion) {
c.bench_function("single_dashed_lines", move |b| { c.bench_function("single_dashed_lines", move |b| {
b.iter(|| { b.iter(|| {