From 15f6f70c25115ed606f9dd21b663df1c8f804b9d Mon Sep 17 00:00:00 2001 From: Alex Butler Date: Tue, 11 Nov 2025 00:27:48 +0000 Subject: [PATCH 1/2] Optimise `SmolStr::clone` 4-5x speedup inline, 0.5x heap (slow down) --- lib/smol_str/CHANGELOG.md | 1 + lib/smol_str/src/lib.rs | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/smol_str/CHANGELOG.md b/lib/smol_str/CHANGELOG.md index fb65d88ad191..b7da6d18a440 100644 --- a/lib/smol_str/CHANGELOG.md +++ b/lib/smol_str/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- Optimise `SmolStr::clone` 4-5x speedup inline, 0.5x heap (slow down). ## 0.3.4 - 2025-10-23 diff --git a/lib/smol_str/src/lib.rs b/lib/smol_str/src/lib.rs index a1d2c2f06744..72d93e2f513d 100644 --- a/lib/smol_str/src/lib.rs +++ b/lib/smol_str/src/lib.rs @@ -104,11 +104,19 @@ impl SmolStr { impl Clone for SmolStr { #[inline] fn clone(&self) -> Self { + // hint for faster inline / slower heap clones + #[cold] + #[inline(never)] + fn cold_clone(v: &SmolStr) -> SmolStr { + SmolStr(v.0.clone()) + } + if !self.is_heap_allocated() { // SAFETY: We verified that the payload of `Repr` is a POD return unsafe { core::ptr::read(self as *const SmolStr) }; } - Self(self.0.clone()) + + cold_clone(self) } } From 5deb6478aa4f2f6bc082248f7a08b3bb38ef8db0 Mon Sep 17 00:00:00 2001 From: Alex Butler Date: Tue, 11 Nov 2025 00:47:21 +0000 Subject: [PATCH 2/2] cleaner impl --- lib/smol_str/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/smol_str/src/lib.rs b/lib/smol_str/src/lib.rs index 72d93e2f513d..91e287c58892 100644 --- a/lib/smol_str/src/lib.rs +++ b/lib/smol_str/src/lib.rs @@ -111,12 +111,12 @@ impl Clone for SmolStr { SmolStr(v.0.clone()) } - if !self.is_heap_allocated() { - // SAFETY: We verified that the payload of `Repr` is a POD - return unsafe { core::ptr::read(self as *const SmolStr) }; + if self.is_heap_allocated() { + return cold_clone(self); } - cold_clone(self) + // SAFETY: We verified that the payload of `Repr` is a POD + unsafe { core::ptr::read(self as *const SmolStr) } } }