lighthouse/consensus
Michael Sproul da4ca024f1 Use SmallVec in Bitfield (#3025)
## Issue Addressed

Alternative to #2935

## Proposed Changes

Replace the `Vec<u8>` inside `Bitfield` with a `SmallVec<[u8; 32>`. This eliminates heap allocations for attestation bitfields until we reach 500K validators, at which point we can consider increasing `SMALLVEC_LEN` to 40 or 48.

While running Lighthouse under `heaptrack` I found that SSZ encoding and decoding of bitfields corresponded to 22% of all allocations by count. I've confirmed that with this change applied those allocations disappear entirely.

## Additional Info

We can win another 8 bytes of space by using `smallvec`'s [`union` feature](https://docs.rs/smallvec/1.8.0/smallvec/#union), although I might leave that for a future PR because I don't know how experimental that feature is and whether it uses some spicy `unsafe` blocks.
2022-02-17 23:55:04 +00:00
..
cached_tree_hash 1.57.0 lints (#2850) 2021-12-03 04:44:30 +00:00
fork_choice Update to superstruct v0.4.1 (#2886) 2022-01-06 03:14:58 +00:00
int_to_bytes Update to tokio 1.1 (#2172) 2021-02-10 23:29:49 +00:00
merkle_proof Get arbitrary check passing (2.0) (#2710) 2021-10-14 02:58:11 +00:00
proto_array v1.1.6 Fork Choice changes (#2822) 2021-12-13 20:43:22 +00:00
safe_arith Remove saturating arith from state_processing (#1644) 2020-09-25 05:18:21 +00:00
serde_utils Implement standard keystore API (#2736) 2022-01-30 23:22:04 +00:00
ssz 1.57.0 lints (#2850) 2021-12-03 04:44:30 +00:00
ssz_derive Implement SSZ union type (#2579) 2021-09-25 05:58:36 +00:00
ssz_types Use SmallVec in Bitfield (#3025) 2022-02-17 23:55:04 +00:00
state_processing Update to consensus-specs v1.1.9 (#3016) 2022-02-14 23:57:23 +00:00
swap_or_not_shuffle Get arbitrary check passing (2.0) (#2710) 2021-10-14 02:58:11 +00:00
tree_hash Bump crate versions (#2829) 2021-12-02 14:29:57 +11:00
tree_hash_derive Implement SSZ union type (#2579) 2021-09-25 05:58:36 +00:00
types Use SmallVec in Bitfield (#3025) 2022-02-17 23:55:04 +00:00