rust-lang / rust-lang/hashbrown
Reduce size_of<HashMap> ?
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 3k
- Forks
- 359
- Avg merge
- 11h 57m
- Merged PRs (30d)
- 2
Description
With the switch to Hashbrow, std::mem::size_of::<std::collections::HashMap<(), ()>>() on 64-bit platforms grew from 40 bytes to 56. (24 to 40 bytes with BuildHasherDefault.)
In Servo’s DOM implementation we have types whose size_of is several hundreds of bytes. Because some not-so-unusual pages can have very many DOM nodes this size can add up to significant memory usage. We have unit tests for size_of to ensure it does not accidentally grow, which fail in today’s Rust Nightly because several types grew by 16 bytes because they contain a HashMap.
Hashbrown’s HashMap contains a RawTable which has five pointer-sized fields:
Some of them seem potentially redundant, but I’m not sure. For example there are two pointers that seem to be in the same allocation. How expensive would it be to re-compute the second pointer every time it is needed?
Are bucket_mask, growth_left, and len related such that one of them could be computed from the others?
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the RawTable fields in src/raw/mod.rs around lines 328-348 and inspect how each field is used. Review the existing size_of unit tests mentioned in the issue, then determine whether any field can be removed or recomputed without changing HashMap behavior. Done means a justified design and passing size checks, or a documented reason the size cannot be reduced.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- performance
- Issue type
- Refactor
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100