From ed3eee2e2a706d568f090f5d9862f0888dbdf670 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Sun, 6 Jul 2014 01:11:13 +0100 Subject: [PATCH] Optimize String::push_byte() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` test new_push_byte ... bench: 6985 ns/iter (+/- 487) = 17 MB/s test old_push_byte ... bench: 19335 ns/iter (+/- 1368) = 6 MB/s ``` ```rust extern crate test; use test::Bencher; static TEXT: &'static str = "\ Unicode est un standard informatique qui permet des échanges \ de textes dans différentes langues, à un niveau mondial."; #[bench] fn old_push_byte(bencher: &mut Bencher) { bencher.bytes = TEXT.len() as u64; bencher.iter(|| { let mut new = String::new(); for b in TEXT.bytes() { unsafe { new.as_mut_vec().push_all([b]) } } }) } #[bench] fn new_push_byte(bencher: &mut Bencher) { bencher.bytes = TEXT.len() as u64; bencher.iter(|| { let mut new = String::new(); for b in TEXT.bytes() { unsafe { new.as_mut_vec().push(b) } } }) } ``` --- src/libcollections/string.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcollections/string.rs b/src/libcollections/string.rs index 936e60388a66..e1467d957d71 100644 --- a/src/libcollections/string.rs +++ b/src/libcollections/string.rs @@ -208,7 +208,7 @@ impl String { /// Appends a byte to this string buffer. The caller must preserve the valid UTF-8 property. #[inline] pub unsafe fn push_byte(&mut self, byte: u8) { - self.push_bytes([byte]) + self.vec.push(byte) } /// Removes the last byte from the string buffer and returns it. Returns `None` if this string