Comments (3)
Yes, your findings are correct, however:
- your test program uses a very specific sequence of keys (all consecutive integers)
- Google sparsehash just uses the integer key as the hash value (pass-through hashing)
This makes the insertion very fast, as there are no collisions. However, it makes finding that a key is not present in the set extremely slow. For that reason, I have chosen to not use pass-through hashing, even though it can look better in simple tests.
To see for yourself, you can add the following lines in your test program, after the insertion:
size_t count = 0;
for (int i = 0; i < n; i++)
if (s.find(rand()) != s.end())
++count;
printf("count = %zu\n", count);
This will demonstrate that the pass-through hashing, which looks very good on insertion-only tests, is probably not advisable in general.
from sparsepp.
I don't advise to use pass-through hashing, but it can easily be done with sparsepp as well. For example define:
struct Hash32 {
size_t operator()(uint32_t k) const { return k; }
};
and your set as: spp::sparse_hash_set<int, Hash32> s;
You will see that the insertion is now faster than with Google's sparse_hash_set, and that the memory usage is reduced to ~1.2GB, still a little bit more than Google's version.
However the lookup of non-present keys will be very slow, so it is probably not a very good idea.
from sparsepp.
Closing the issue, please reopen is you still have some questions.
from sparsepp.
Related Issues (20)
- Support operator[] with rvalue HOT 1
- When hashing on vector HOT 13
- Help me to serialize/deserialize sparse_hash_map<int , vector< std::string > > HOT 1
- missing return value in function spp_sptr& operator=(spp_sptr &&o) ? HOT 1
- SIGSEGV on using move-assigned-from hash set HOT 3
- Unable to create map for value type with deleted copy constructor HOT 2
- Can't insert std::tuple: spp uses deleted constructor/destructor HOT 1
- Lookup non-present keys becomes very slow. HOT 1
- Do you support C++11 stateful allocators? HOT 1
- Default allocator doesn't throw and caller doesn't check for NULL HOT 1
- SEGV after moving hash_map HOT 2
- conan package HOT 2
- sparse_hash_map<uint32_t, uint64_t> takes more memory than sparse_hash_map<uint64_t, uint64_t> HOT 1
- memcpy can happen with null "source" parameter HOT 6
- class-memaccess warning when compiling with GCC 8 or later HOT 1
- Problem when compiling on macOS catalina HOT 6
- Can sparse_hash_map support unique_ptr?
- Compiler warning on realloc call within sparsepp. HOT 1
- Error when compile: is not a special member function which can be defaulted HOT 2
- Missing return value. HOT 2
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 sparsepp.