From 2fd4a36c0d24e61ae44dedcbda7993cac8ba6b06 Mon Sep 17 00:00:00 2001 From: Filip Andersson <17986183+FilipAndersson245@users.noreply.github.com> Date: Thu, 15 Jun 2023 00:27:12 +0200 Subject: [PATCH] Changes global allocator to mimalloc, improving performance. (#9415) # Description this PR makes nushell use mimalloc as the default allocator, this has the benefit of reducing startup time on my machine. `17%` on linux and `22%` on windows, when testing using hyperfine. the overhead to compile seem to be quite small, aswell as the increase of binary size quite small on linux the binary went from `33.1mb` to `33.2mb` linux ![image](https://github.com/nushell/nushell/assets/17986183/ba5379b4-2c08-483a-a9ff-a9d8524d2943) windows ![image](https://github.com/nushell/nushell/assets/17986183/fda5090f-96a9-48d1-ada4-617694b9d880) # User-Facing Changes # Tests + Formatting # After Submitting --- Cargo.lock | 20 +++++++++++++++++++ Cargo.toml | 4 ++++ crates/nu-cmd-lang/Cargo.toml | 1 + .../nu-cmd-lang/src/core_commands/version.rs | 14 +++++++++++++ src/main.rs | 4 ++++ 5 files changed, 43 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 5be2870477..5186f6f8ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2164,6 +2164,16 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +[[package]] +name = "libmimalloc-sys" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ac0e912c8ef1b735e92369695618dc5b1819f5a7bf3f167301a3ba1cea515e" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "libproc" version = "0.13.0" @@ -2397,6 +2407,15 @@ dependencies = [ "syn 2.0.17", ] +[[package]] +name = "mimalloc" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2894987a3459f3ffb755608bd82188f8ed00d0ae077f1edea29c068d639d98" +dependencies = [ + "libmimalloc-sys", +] + [[package]] name = "mime" version = "0.3.17" @@ -2648,6 +2667,7 @@ dependencies = [ "ctrlc", "log", "miette", + "mimalloc", "nix", "nu-ansi-term", "nu-cli", diff --git a/Cargo.toml b/Cargo.toml index 602923c3b1..046789cf36 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,6 +67,8 @@ nu-utils = { path = "./crates/nu-utils", version = "0.81.1" } nu-ansi-term = "0.47.0" reedline = { version = "0.20.0", features = ["bashisms", "sqlite"]} +mimalloc = { version = "0.1.37", default-features = false, optional = true} + crossterm = "0.26" ctrlc = "3.4" log = "0.4" @@ -118,6 +120,8 @@ wasi = ["nu-cmd-lang/wasi"] # Enable to statically link OpenSSL; otherwise the system version will be used. Not enabled by default because it takes a while to build static-link-openssl = ["dep:openssl", "nu-cmd-lang/static-link-openssl"] +mimalloc = ["nu-cmd-lang/mimalloc", "dep:mimalloc"] + # Stable (Default) which-support = ["nu-command/which-support", "nu-cmd-lang/which-support"] trash-support = ["nu-command/trash-support", "nu-cmd-lang/trash-support"] diff --git a/crates/nu-cmd-lang/Cargo.toml b/crates/nu-cmd-lang/Cargo.toml index 60fd9ed5f1..6a7511e7de 100644 --- a/crates/nu-cmd-lang/Cargo.toml +++ b/crates/nu-cmd-lang/Cargo.toml @@ -28,6 +28,7 @@ ahash = "0.8.3" shadow-rs = { version = "0.22", default-features = false } [features] +mimalloc = [] which-support = [] trash-support = [] sqlite = [] diff --git a/crates/nu-cmd-lang/src/core_commands/version.rs b/crates/nu-cmd-lang/src/core_commands/version.rs index ed556774b8..c23cb0f312 100644 --- a/crates/nu-cmd-lang/src/core_commands/version.rs +++ b/crates/nu-cmd-lang/src/core_commands/version.rs @@ -117,6 +117,12 @@ pub fn version( vals.push(Value::string(build_rust_channel, call.head)); } + cols.push("allocator".to_string()); + vals.push(Value::String { + val: global_allocator().to_string(), + span: call.head, + }); + cols.push("features".to_string()); vals.push(Value::String { val: features_enabled().join(", "), @@ -144,6 +150,14 @@ pub fn version( .into_pipeline_data()) } +fn global_allocator() -> &'static str { + if cfg!(feature = "mimalloc") { + "mimalloc" + } else { + "standard" + } +} + fn features_enabled() -> Vec { let mut names = vec!["default".to_string()]; diff --git a/src/main.rs b/src/main.rs index 58d71bb758..a6cc443ea5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,10 @@ mod test_bins; #[cfg(test)] mod tests; +#[cfg(feature = "mimalloc")] +#[global_allocator] +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; + use crate::{ command::parse_commandline_args, config_files::set_config_path,