From 965c2df0df3162a0f24b44ccd83fa5d5853feac7 Mon Sep 17 00:00:00 2001 From: James Kingsley Date: Fri, 22 May 2026 11:01:54 +0100 Subject: [PATCH] perf(alloc): feature for sort_unstable --- Cargo.toml | 1 + src/lib.rs | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 37c3651..fcd0481 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ name = "ex1" [features] default = [] with_serde = ["serde/derive"] +sort_unstable = [] [dependencies] num-traits = "0.2.12" diff --git a/src/lib.rs b/src/lib.rs index b76a136..c950d9b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -194,11 +194,27 @@ where /// let lapper = Lapper::new(data); /// ``` pub fn new(mut intervals: Vec>) -> Self { + #[cfg(feature = "sort_unstable")] + intervals.sort_unstable(); + + #[cfg(not(feature = "sort_unstable"))] intervals.sort(); + let (mut starts, mut stops): (Vec<_>, Vec<_>) = intervals.iter().map(|x| (x.start, x.stop)).unzip(); - starts.sort(); - stops.sort(); + + #[cfg(feature = "sort_unstable")] + { + starts.sort_unstable(); + stops.sort_unstable(); + } + + #[cfg(not(feature = "sort_unstable"))] + { + starts.sort(); + stops.sort(); + } + let mut max_len = zero::(); for interval in intervals.iter() { let i_len = interval @@ -376,8 +392,19 @@ where // Fix the starts and stops used by counts let (mut starts, mut stops): (Vec<_>, Vec<_>) = self.intervals.iter().map(|x| (x.start, x.stop)).unzip(); - starts.sort(); - stops.sort(); + + #[cfg(feature = "sort_unstable")] + { + starts.sort_unstable(); + stops.sort_unstable(); + } + + #[cfg(not(feature = "sort_unstable"))] + { + starts.sort(); + stops.sort(); + } + self.starts = starts; self.stops = stops; self.max_len = self