Comments (3)
Could branching between four different possible representations be a potential handicap as well?
I remember the times when small size optimization for Vec
/String
was discussed; the conclusion from people who tried to do this and measured the performance impact on rustc was that the added branching everywhere was just not worth it with the allocator that was in use (jemalloc was the default back then). I realise that the atomic ordering guarantees may be more costly, so a non-shared representation variant may still be worth it; not being much involved in this project's history, I can only assume that the other representations have shown performance improvement in realistic use cases.
I think a more promising direction for optimization would be to cut down on mutating APIs to optimize the primary use case for bytes
, which is basically covered by the API of Buf
/BufMut
, .split_to(n).freeze()
, and BytesMut::reserve
: repetitions of pulling data incrementally into a BytesMut
in a single task and handing off complete chunks in Bytes
for potentially shared processing that does not tend to modify the data in place. I believe instilling some usage discipline can significantly reduce overhead on the hot paths.
If extension API on Bytes
and segmentation of BytesMut
is removed, the internal representation of BytesMut
could just own a Shared
instance referenced by immutable Bytes
views (those which are in the ARC form) and never need to touch the reference count until it's dropped. Bytes
would not need the capacity member so the struct would be 3/4 the size. It would still be possible to convert Bytes
into BytesMut
with no copying in case the Bytes
' reference to the buffer is unique.
I can put these reformist ideas in more detail in an RFC-like issue if there is interest in this direction from the development team.
from bytes.
@mzabaluev Sure, more details would be needed to consider the change:
- List of APIs added / removed.
- Changes to internals.
- Performance characteristic differences for common usage patterns of
Bytes
/BytesMut
.
from bytes.
I've done my homework in #268.
from bytes.
Related Issues (20)
- 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
- Docs: `Buf::chunk` should have more restrictions. HOT 2
- 1.6.0 yanked? HOT 12
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.