Comments (10)
The intention of tracking the original allocation size was to handle a regression when transitioning to tokio-io
. Part of the problem is that Decoder
don't know the size of the originally allocated buffer. So Decoder
is expected to reserve only as much as is needed for the current frame, but then, you can get into a situation where tiny reallocations are required.
Being able to truncate_front
would be nice... but I am unsure what the best trade off is... At this point, removing the original capacity tracking would require either figuring out how to do so w/o it being a breaking change OR figure out a way to migrate off for tokio-io 0.2.
from bytes.
Shouldn't FramedRead
store initial capacity explicitly, and use it in reserve
, and do not rely on Bytes
property of preserving capacity in split_*
and take
operations?
It should be a mostly backward-compatible change of tokio-io (it will be source-compatible, but behavior will change slighly), no need to wait for tokio-io 0.2.
from bytes.
FramedRead
does not call reserve
. The Decoder
impl calls reserve
as needed.
from bytes.
Even if Decoder
impl calls reserve
, FramedRead
could also call reserve
before read_buf
with initial capacity.
from bytes.
How does FramedRead
know when to call reserve
? If it calls reserve
w/ the initial capacity each "tick" then there is no point in using Bytes
because every iteration will allocate a brand new chunk.
Decoder
is the thing that knows when to call reserve
correctly, but it doesn't know the "right" amount... FramedRead
knows this.
from bytes.
OK, I think I got it.
FramedRead
could call reserve(initial_capacity)
right before read_buf
. However, in that case it will be one unnecessary reallocation per read_buf
if last reserve
call in Decoder
reserved less than initial_capacity
.
So it is not possible to make this change without breaking/changing tokio-io
.
from bytes.
Somewhat related, what's the cheapest way of "consuming" the first N bytes of Bytes right now?
I'm using split_off(..)
from bytes.
So, tokio-io Decoder::decode
could be changed to something like:
// Ok(Ok(item)) means it was decoded successfully
// Ok(Err(44)) means that decoder needs 44 bytes to decode something (e. g. a header or an item)
fn decode(&mut self, src: &mut BytesMut) -> Result<Result<Self::Item, usize>, Self::Error>;
And FramedRead::poll
should do reserve
with error value of inner result.
Right?
from bytes.
Technically, yes. However, the goal of Encoder
and Decoder
is to be as simple as possible. I think we already have strayed from that goal too much.
from bytes.
Closing this issue in favor of tokio-io issue I've just created.
from bytes.
Related Issues (20)
- Need to obtain remaining buffer space HOT 1
- Potential to modify ordering for load in bytes.rs and bytes_mut.rs HOT 2
- Feature Request: Default implementations for heap types which support the unstable allocator API HOT 4
- Feature Request: Default implementations for pinned types HOT 2
- Feature Request: Seekable Buffer ("SeekBuf") and cursor/iterator support HOT 2
- `BufMut` does not include safety invariants in trait documentation HOT 1
- Enable shrinking of allocations
- Contradictory allocation behaviour compared to documentation HOT 9
- Confusing documentation around `Arc<[u8]>` compatibility HOT 1
- Should clone benchmark use use `test::blackbox`? HOT 1
- Explicitly guarantee `Bytes` to be immutable HOT 2
- Expose UTF-8 validated string type HOT 2
- Buf::chunks_vectored() is wrong if chunk() isn't the whole buf HOT 3
- Feature request: fallible version of `BytesMut::unsplit` (i.e. make `BytesMut::try_unsplit` public) HOT 2
- Test for unknown --cfg flags in ci
- Splice for BytesMut HOT 2
- Consider replacing Bytes::make_mut by impl From<Bytes> for BytesMut HOT 5
- Is the conversion from bytes to Vec<u8> O(1) HOT 5
- Feature request: implement `From<Cow<'static, [u8]>>` for `Bytes`
- BytesMut::zeroed doc header improvement HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bytes.