From 2fcb8b5c201d22060f1ba46cc2291cacca593e02 Mon Sep 17 00:00:00 2001 From: Ryan Lopopolo Date: Tue, 16 Feb 2021 14:14:59 -0800 Subject: [PATCH] Optimize FromIterator to reuse the first allocation --- library/std/src/ffi/os_str.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/library/std/src/ffi/os_str.rs b/library/std/src/ffi/os_str.rs index b7aff83eaf50..8240aafae74e 100644 --- a/library/std/src/ffi/os_str.rs +++ b/library/std/src/ffi/os_str.rs @@ -1208,11 +1208,18 @@ impl<'a> Extend<&'a OsStr> for OsString { impl FromIterator for OsString { #[inline] fn from_iter>(iter: I) -> Self { - let mut buf = Self::new(); - for s in iter { - buf.push(&s); + let mut iterator = iter.into_iter(); + + // Because we're iterating over `OsString`s, we can avoid at least + // one allocation by getting the first string from the iterator + // and appending to it all the subsequent strings. + match iterator.next() { + None => OsString::new(), + Some(mut buf) => { + buf.extend(iterator); + buf + } } - buf } }