From f055054eab2a510ad3252599a015f660eef6aedd Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Sun, 19 Apr 2015 10:59:06 -0700 Subject: [PATCH] collections: Move optimized String::from_str to String::from This implementation is currently about 3-4 times faster than using the `.to_string()` based approach. --- src/libcollections/string.rs | 13 ++++++++++++- src/libcollectionstest/string.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/libcollections/string.rs b/src/libcollections/string.rs index 74af5783fa80..81710286fde2 100644 --- a/src/libcollections/string.rs +++ b/src/libcollections/string.rs @@ -1013,9 +1013,20 @@ impl AsRef for String { #[stable(feature = "rust1", since = "1.0.0")] impl<'a> From<&'a str> for String { + #[cfg(not(test))] #[inline] fn from(s: &'a str) -> String { - s.to_string() + String { vec: <[_]>::to_vec(s.as_bytes()) } + } + + // HACK(japaric): with cfg(test) the inherent `[T]::to_vec` method, which is + // required for this method definition, is not available. Since we don't + // require this method for testing purposes, I'll just stub it + // NB see the slice::hack module in slice.rs for more information + #[inline] + #[cfg(test)] + fn from(_: &str) -> String { + panic!("not available with cfg(test)"); } } diff --git a/src/libcollectionstest/string.rs b/src/libcollectionstest/string.rs index 1bac3a529809..d842d1e7f27c 100644 --- a/src/libcollectionstest/string.rs +++ b/src/libcollectionstest/string.rs @@ -450,3 +450,30 @@ fn bench_exact_size_shrink_to_fit(b: &mut Bencher) { r }); } + +#[bench] +fn bench_from_str(b: &mut Bencher) { + let s = "Hello there, the quick brown fox jumped over the lazy dog! \ + Lorem ipsum dolor sit amet, consectetur. "; + b.iter(|| { + String::from_str(s) + }) +} + +#[bench] +fn bench_from(b: &mut Bencher) { + let s = "Hello there, the quick brown fox jumped over the lazy dog! \ + Lorem ipsum dolor sit amet, consectetur. "; + b.iter(|| { + String::from(s) + }) +} + +#[bench] +fn bench_to_string(b: &mut Bencher) { + let s = "Hello there, the quick brown fox jumped over the lazy dog! \ + Lorem ipsum dolor sit amet, consectetur. "; + b.iter(|| { + s.to_string() + }) +}