// compile on linux with: g++ -std=c++11 -O2 perftest1.cc -o perftest1 // ----------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #define SPP 1 #define DENSE 0 #define SPARSE 0 #define STD 0 #if SPP #include #elif DENSE #include #elif SPARSE #include #elif STD #include #endif using std::make_pair; template void test(T &s, int count) { spp::Timer timer; timer.snap(); srand(0); for (int i = 0; i < count; ++i) s.insert(make_pair(rand(), i)); printf("%d random inserts in %5.2f seconds\n", count, timer.get_delta() / 1000); timer.snap(); srand(0); for (int i = 0; i < count; ++i) s.find(rand()); printf("%d random finds in %5.2f seconds\n", count, timer.get_delta() / 1000); timer.snap(); srand(1); for (int i = 0; i < count; ++i) s.find(rand()); printf("%d random not-finds in %5.2f seconds\n", count, timer.get_delta() / 1000); s.clear(); timer.snap(); srand(0); for (int i = 0; i < count; ++i) s.insert(make_pair(i, i)); printf("%d sequential inserts in %5.2f seconds\n", count, timer.get_delta() / 1000); timer.snap(); srand(0); for (int i = 0; i < count; ++i) s.find(i); printf("%d sequential finds in %5.2f seconds\n", count, timer.get_delta() / 1000); timer.snap(); srand(1); for (int i = 0; i < count; ++i) { int x = rand(); s.find(x); } printf("%d random not-finds in %5.2f seconds\n", count, timer.get_delta() / 1000); s.clear(); timer.snap(); srand(0); for (int i = 0; i < count; ++i) s.insert(make_pair(-i, -i)); printf("%d neg sequential inserts in %5.2f seconds\n", count, timer.get_delta() / 1000); timer.snap(); srand(0); for (int i = 0; i < count; ++i) s.find(-i); printf("%d neg sequential finds in %5.2f seconds\n", count, timer.get_delta() / 1000); timer.snap(); srand(1); for (int i = 0; i < count; ++i) s.find(rand()); printf("%d random not-finds in %5.2f seconds\n", count, timer.get_delta() / 1000); s.clear(); } struct Hasher64 { size_t operator()(uint64_t k) const { return (k ^ 14695981039346656037ULL) * 1099511628211ULL; } }; struct Hasher32 { size_t operator()(uint32_t k) const { return (k ^ 2166136261U) * 16777619UL; } }; struct Hasheri32 { size_t operator()(int k) const { return (k ^ 2166136261U) * 16777619UL; } }; struct Hasher_32 { size_t operator()(int k) const { uint32_t a = (uint32_t)k; #if 0 a = (a ^ 61) ^ (a >> 16); a = a + (a << 3); a = a ^ (a >> 4); a = a * 0x27d4eb2d; a = a ^ (a >> 15); return a; #else a = a ^ (a >> 4); a = (a ^ 0xdeadbeef) + (a << 5); a = a ^ (a >> 11); return a; #endif } }; int main() { #if SPP spp::sparse_hash_map s; printf ("Testing spp::sparse_hash_map\n"); #elif DENSE google::dense_hash_map s; s.set_empty_key(-INT_MAX); s.set_deleted_key(-(INT_MAX - 1)); printf ("Testing google::dense_hash_map\n"); #elif SPARSE google::sparse_hash_map s; s.set_deleted_key(-INT_MAX); printf ("Testing google::sparse_hash_map\n"); #elif STD std::unordered_map s; printf ("Testing std::unordered_map\n"); #endif printf ("------------------------------\n"); test(s, 50000000); return 0; }