You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reduce the amount of llvm IR instantiated
This works to improve the generated code in a similar way to #204 , however it is entirely orthogonal to it but also far more invasive.
The main change here is the introduction of `RawTableInner` which is contains all the fields that `RawTable` has but without being parameterized by `T`. Methods have been moved to this new type in parts or their entirety and `RawTable` forwards to these methods.
For this small test case with 4 different maps there is a reduction of the number of llvm lines generated by -17% (18088 / 21873 =0.82695560737) .
```rust
fn main() {
let mut map1 = hashbrown::HashMap::new();
map1.insert(1u8, "");
map1.reserve(1000);
let mut map2 = hashbrown::HashMap::new();
map2.insert(1i16, "");
map2.reserve(1000);
let mut map3 = hashbrown::HashMap::new();
map3.insert(3u16, "");
map3.reserve(1000);
let mut map4 = hashbrown::HashMap::new();
map4.insert(3u64, "");
map4.reserve(1000);
dbg!((
map1.iter().next(),
map2.iter().next(),
map3.iter().next(),
map4.iter().next()
));
}
```
The commits are almost entirely orthogonal (except the first which does the main refactoring to support the rest) and if some are not desired they can be removed. If it helps, this PR could also be split up into multiple.
For most commitst I don't expect any performance degradation (unless LLVM stops inlining some function as it is now called more), but there are a couple of commits that does slow parts down however these should only be in the cold parts of the code (for instance, panic handling).
0 commit comments