about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKornel <kornel@geekhood.net>2025-03-16 16:17:33 +0000
committerKornel <kornel@geekhood.net>2025-04-04 15:52:33 +0100
commite6498670868810b7d232223487e8f2019a6ebdbb (patch)
treeaf768e178ff4a71f50caebb3408703d1e5bb8f7c
parenta4166dabaae56ab0d35a7825c3e7008778eacf34 (diff)
downloadrust-e6498670868810b7d232223487e8f2019a6ebdbb.tar.gz
rust-e6498670868810b7d232223487e8f2019a6ebdbb.zip
Optimize slice Iter::nth
-rw-r--r--library/core/src/slice/iter.rs18
1 files changed, 8 insertions, 10 deletions
diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs
index d48248749c2..b1a19e3427d 100644
--- a/library/core/src/slice/iter.rs
+++ b/library/core/src/slice/iter.rs
@@ -1536,17 +1536,15 @@ impl<'a, T> Iterator for Chunks<'a, T> {
     #[inline]
     fn nth(&mut self, n: usize) -> Option<Self::Item> {
         let (start, overflow) = n.overflowing_mul(self.chunk_size);
-        if start >= self.v.len() || overflow {
-            self.v = &[];
-            None
-        } else {
-            let end = match start.checked_add(self.chunk_size) {
-                Some(sum) => cmp::min(self.v.len(), sum),
-                None => self.v.len(),
-            };
-            let nth = &self.v[start..end];
-            self.v = &self.v[end..];
+        // min(len) makes a wrong start harmless, but enables optimizing this to brachless code
+        let chunk_start = &self.v[start.min(self.v.len())..];
+        let (nth, remainder) = chunk_start.split_at(self.chunk_size.min(chunk_start.len()));
+        if !overflow && start < self.v.len() {
+            self.v = remainder;
             Some(nth)
+        } else {
+            self.v = &self.v[..0]; // cheaper than &[]
+            None
         }
     }