]> git.lizzy.rs Git - rust.git/commitdiff
Optimize String::push_byte()
authorSimon Sapin <simon.sapin@exyr.org>
Sun, 6 Jul 2014 00:11:13 +0000 (01:11 +0100)
committerSimon Sapin <simon.sapin@exyr.org>
Sun, 6 Jul 2014 00:11:13 +0000 (01:11 +0100)
```
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

index 936e60388a66ae8223cca470b4f837d626399bfc..e1467d957d710398d04e4af952e749944caa18b3 100644 (file)
@@ -208,7 +208,7 @@ pub fn truncate(&mut self, len: uint) {
     /// 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