Fix InputBuffer::reserve() to not be a no-op

The current implementation uses the `remaining_mut()` function from the
bytes::BufMut implementation for Vec<u8>.

In terms of the BufMut trait, a Vec buffer has infinite capacity - you
can always write more to the buffer, since the Vec grows as needed.
Hence, the `remaining_mut` here actually returns +∞ (actually,
`usize::MAX - len`).

So the first `if` is always true, and the calls to `reserve` never
actually allocate the appropriate space. What happens instead is that
the `bytes_mut()` call in `read_from` picks up the slack, but it merely
grows the buffer a 64 bytes at a time, which slows things down.

This changes the check to use the Vec capacity instead of
`remaining_mut`. In my profile (sending 100,000 10KiB messages back and
forth), this reduces `__memmove_avx_unaligned_erms`'s share of the
total runtime from ~77% to ~53%.
pull/7/head
Ran Benita 8 years ago
parent be834ac261
commit 8e49bea00f
  1. 3
      src/input_buffer.rs

@ -23,7 +23,8 @@ impl InputBuffer {
/// Reserve the given amount of space. /// Reserve the given amount of space.
pub fn reserve(&mut self, space: usize, limit: usize) -> Result<(), SizeLimit>{ pub fn reserve(&mut self, space: usize, limit: usize) -> Result<(), SizeLimit>{
if self.inp_mut().remaining_mut() >= space { let remaining = self.inp_mut().capacity() - self.inp_mut().len();
if remaining >= space {
// We have enough space right now. // We have enough space right now.
Ok(()) Ok(())
} else { } else {

Loading…
Cancel
Save