You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							162 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							162 lines
						
					
					
						
							3.8 KiB
						
					
					
				
								// compile on linux with: g++ -std=c++11 -O2 perftest1.cc -o perftest1
							 | 
						|
								// -----------------------------------------------------------------------
							 | 
						|
								#include <fstream>
							 | 
						|
								#include <iostream>
							 | 
						|
								#include <ctime>
							 | 
						|
								#include <cstdio>
							 | 
						|
								#include <climits>
							 | 
						|
								#include <functional>
							 | 
						|
								#include <vector>
							 | 
						|
								#include <utility>
							 | 
						|
								
							 | 
						|
								#include <sparsepp/spp_timer.h>
							 | 
						|
								
							 | 
						|
								#define SPP 1
							 | 
						|
								#define DENSE 0
							 | 
						|
								#define SPARSE 0
							 | 
						|
								#define STD 0
							 | 
						|
								
							 | 
						|
								#if SPP
							 | 
						|
								    #include <sparsepp/spp.h>
							 | 
						|
								#elif DENSE
							 | 
						|
								    #include <google/dense_hash_map>
							 | 
						|
								#elif SPARSE
							 | 
						|
								    #include <google/sparse_hash_map>
							 | 
						|
								#elif STD
							 | 
						|
								    #include <unordered_map>
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								using std::make_pair;
							 | 
						|
								
							 | 
						|
								template <class T>
							 | 
						|
								void test(T &s, int count) 
							 | 
						|
								{
							 | 
						|
								    spp::Timer<std::milli> 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<int, int /*, Hasheri32 */> s;
							 | 
						|
								    printf ("Testing spp::sparse_hash_map\n");
							 | 
						|
								#elif DENSE
							 | 
						|
								    google::dense_hash_map<int, int/* , Hasher_32 */> 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<int, int/* , Hasher_32 */> s;
							 | 
						|
								    s.set_deleted_key(-INT_MAX); 
							 | 
						|
								    printf ("Testing google::sparse_hash_map\n");
							 | 
						|
								#elif STD
							 | 
						|
								    std::unordered_map<int, int/* , Hasher_32 */> s;
							 | 
						|
								    printf ("Testing std::unordered_map\n");
							 | 
						|
								#endif
							 | 
						|
								    printf ("------------------------------\n");
							 | 
						|
								    test(s, 50000000);
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    return 0;
							 | 
						|
								}
							 |