]> git.lizzy.rs Git - rust.git/commit
ToBase64 and ToHex perf improvements
authorSteven Fackler <sfackler@gmail.com>
Mon, 5 Aug 2013 03:51:26 +0000 (23:51 -0400)
committerSteven Fackler <sfackler@gmail.com>
Tue, 6 Aug 2013 16:58:36 +0000 (09:58 -0700)
commitff5fdffc135f55e751dfcff0df1f52b9f4faad17
tree1bf01497186c19249e1a8b2d4a8b7ca2854cae54
parent463e2416e98238e294d332397048b106d85fd474
ToBase64 and ToHex perf improvements

The overhead of str::push_char is high enough to cripple the performance
of these two functions. I've switched them to build the output in a
~[u8] and then convert to a string later. Since we know exactly the
bytes going into the vector, we can use the unsafe version to avoid the
is_utf8 check.

I could have riced it further with vec::raw::get, but it only added
~10MB/s so I didn't think it was worth it. ToHex is still ~30% slower
than FromHex, which is puzzling.

Before:

```
test base64::test::from_base64 ... bench: 1000 ns/iter (+/- 349) = 204 MB/s
test base64::test::to_base64 ... bench: 2390 ns/iter (+/- 1130) = 63 MB/s
...
test hex::tests::bench_from_hex ... bench: 884 ns/iter (+/- 220) = 341 MB/s
test hex::tests::bench_to_hex ... bench: 2453 ns/iter (+/- 919) = 61 MB/s
```

After:

```
test base64::test::from_base64 ... bench: 1271 ns/iter (+/- 600) = 160 MB/s
test base64::test::to_base64 ... bench: 759 ns/iter (+/- 286) = 198 MB/s
...
test hex::tests::bench_from_hex ... bench: 875 ns/iter (+/- 377) = 345 MB/s
test hex::tests::bench_to_hex ... bench: 593 ns/iter (+/- 240) = 254 MB/s
```
src/libextra/base64.rs
src/libextra/hex.rs