Comments (4)
I think this is just a case of some operations not being properly inlined. The solution is to throw a bunch of #[inline]
into map.rs and set.rs.
from hashbrown.
Thanks for the quick reply and fix!
I just tried my original test with the your master
branch and indeed, the entry()
version is faster now 🎉 (2.06s vs 2.35s in my original test; test environment is slightly different than in my first post, so those numbers are not comparable). In the test benchmark I posted above, I get the following results now:
test brown_entry ... bench: 10,416,253 ns/iter (+/- 6,420,959)
test brown_manual ... bench: 16,704,658 ns/iter (+/- 8,961,890)
test fnv_entry ... bench: 43,876,666 ns/iter (+/- 27,247,781)
test fnv_manual ... bench: 39,413,669 ns/iter (+/- 22,134,246)
test std_entry ... bench: 68,217,384 ns/iter (+/- 32,603,154)
test std_manual ... bench: 86,265,556 ns/iter (+/- 32,434,485)
However, I think that there is still some improvement, at least for the VacantEntry
case. (But I only skimmed the code, so I might be very wrong). In this line:
map.entry(key).or_insert_with(|| produce_value())
Let's assume key
is not yet in the map.
First entry
is called. It calculates the hash, performs the lookup and creates a corresponding Entry
value. Then, or_insert_with
is executed (which basically only calls VacantEntry::insert
). This leads to RawTable::insert
. And here is where I think redundant work is done: this last insert
function performs the lookup again. The hash is only calculated once, because it is stored in VacantEntry
. But couldn't the bucket index also be stored in VacantEntry
? That way the insert operation wouldn't need to search for a slot to insert. Right?
Or is it just not worth it caching the index? I only have limited knowledge of the underlying data structure :/
Anyway, thanks again!
from hashbrown.
This is not possible because of the way lookups work. Since we scan groups of 16 elements in parallel using SIMD, we don't get a bucket index when a lookup fails. We have to perform a second scan which looks for slots that are either EMPTY
or DELETED
.
from hashbrown.
Ah ok, that makes sense. Thank you :)
from hashbrown.
Related Issues (20)
- Support fallible eq and hasher in raw API HOT 8
- ahash shouldn't be the default Hasher HOT 3
- UB on aarch64_be-unknown-linux-gnu_ilp32 HOT 1
- latest/recent rev appears to break ahash/compile-time-rng usage HOT 2
- Why the identity function can be used as unlikely function? HOT 3
- `hashbrown` fails to compile as a transitive dependency HOT 2
- allocator-api2 default-feature? HOT 2
- Compiling hashbrown 0.14.2 for aarch64-unknown-linux-gnu with "target-cpu=cortex-a53" generates illegal instructions HOT 2
- Switching to GxHash? HOT 9
- Feature: increase capacity according to the actual size returned by the allocator HOT 2
- Hashbrown crash due to bad malloc HOT 1
- 0.14.3 - no method named `clear` found for struct `HashMap` in the current scope HOT 5
- Benchmark biaised due to no fence around input
- assertion failed: buckets.is_power_of_two() HOT 8
- Build breaks on nightly due to use of `stdsimd` rust feature in ahash 0.8.6 HOT 2
- Was swap-remove behavior ever considered when removing entries? HOT 10
- Consider returning to 1.63.0 MSRV HOT 1
- How to calculate the size of the hashbrown::HashMap at runtime? HOT 1
- LLVM failed to use the knowledge from a never-overflow assumption HOT 13
- Library test `map::test_map::test_clone_from_memory_leaks` errors with using uninitialized data under valgrind and miri
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 hashbrown.