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.
		
		
		
		
		
			
		
			
				
					
					
						
							128 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							128 lines
						
					
					
						
							4.2 KiB
						
					
					
				
								#include <map>
							 | 
						|
								#include <unordered_map>
							 | 
						|
								#include <string>
							 | 
						|
								#include <iostream>
							 | 
						|
								#include <chrono>
							 | 
						|
								#include <vector>
							 | 
						|
								#include <sparsepp/spp.h>
							 | 
						|
								
							 | 
						|
								#include <sstream>
							 | 
						|
								
							 | 
						|
								namespace patch
							 | 
						|
								{
							 | 
						|
								    template <typename T> std::string to_string(const T& n)
							 | 
						|
								    {
							 | 
						|
								        std::ostringstream stm;
							 | 
						|
								        stm << n;
							 | 
						|
								        return stm.str();
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#if defined(SPP_NO_CXX11_RVALUE_REFERENCES)
							 | 
						|
								    #warning "problem: we expect spp will detect we have rvalue support"
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								template <typename T>
							 | 
						|
								using milliseconds = std::chrono::duration<T, std::milli>;
							 | 
						|
								
							 | 
						|
								class custom_type
							 | 
						|
								{
							 | 
						|
								    std::string one = "one";
							 | 
						|
								    std::string two = "two";
							 | 
						|
								    std::uint32_t three = 3;
							 | 
						|
								    std::uint64_t four = 4;
							 | 
						|
								    std::uint64_t five = 5;
							 | 
						|
								public:
							 | 
						|
								    custom_type() = default;
							 | 
						|
								    // Make object movable and non-copyable
							 | 
						|
								    custom_type(custom_type &&) = default;
							 | 
						|
								    custom_type& operator=(custom_type &&) = default;
							 | 
						|
								    // should be automatically deleted per http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014
							 | 
						|
								    //custom_type(custom_type const&) = delete;
							 | 
						|
								    //custom_type& operator=(custom_type const&) = delete;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								void test(std::size_t iterations, std::size_t container_size)
							 | 
						|
								{
							 | 
						|
								    std::clog << "bench: iterations: " << iterations <<  " / container_size: "  << container_size << "\n";
							 | 
						|
								    {
							 | 
						|
								        std::size_t count = 0;
							 | 
						|
								        auto t1 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        for (std::size_t i=0; i<iterations; ++i)
							 | 
						|
								        {
							 | 
						|
								            std::unordered_map<std::string,custom_type> m;
							 | 
						|
								            m.reserve(container_size);
							 | 
						|
								            for (std::size_t j=0; j<container_size; ++j)
							 | 
						|
								                m.emplace(patch::to_string(j),custom_type());
							 | 
						|
								            count += m.size();
							 | 
						|
								        }
							 | 
						|
								        auto t2 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        auto elapsed = milliseconds<double>(t2 - t1).count();
							 | 
						|
								        if (count != iterations*container_size)
							 | 
						|
								            std::clog << "  invalid count: " << count << "\n";
							 | 
						|
								        std::clog << "  std::unordered_map:     " << std::fixed << int(elapsed) << " ms\n";
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    {
							 | 
						|
								        std::size_t count = 0;
							 | 
						|
								        auto t1 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        for (std::size_t i=0; i<iterations; ++i)
							 | 
						|
								        {
							 | 
						|
								            std::map<std::string,custom_type> m;
							 | 
						|
								            for (std::size_t j=0; j<container_size; ++j)
							 | 
						|
								                m.emplace(patch::to_string(j),custom_type());
							 | 
						|
								            count += m.size();
							 | 
						|
								        }
							 | 
						|
								        auto t2 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        auto elapsed = milliseconds<double>(t2 - t1).count();
							 | 
						|
								        if (count != iterations*container_size)
							 | 
						|
								            std::clog << "  invalid count: " << count << "\n";
							 | 
						|
								        std::clog << "  std::map:               " << std::fixed << int(elapsed) << " ms\n";
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    {
							 | 
						|
								        std::size_t count = 0;
							 | 
						|
								        auto t1 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        for (std::size_t i=0; i<iterations; ++i)
							 | 
						|
								        {
							 | 
						|
								            std::vector<std::pair<std::string,custom_type>> m;
							 | 
						|
								            m.reserve(container_size);
							 | 
						|
								            for (std::size_t j=0; j<container_size; ++j)
							 | 
						|
								                m.emplace_back(patch::to_string(j),custom_type());
							 | 
						|
								            count += m.size();
							 | 
						|
								        }
							 | 
						|
								        auto t2 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        auto elapsed = milliseconds<double>(t2 - t1).count();
							 | 
						|
								        if (count != iterations*container_size)
							 | 
						|
								            std::clog << "  invalid count: " << count << "\n";
							 | 
						|
								        std::clog << "  std::vector<std::pair>: " << std::fixed << int(elapsed) << " ms\n";
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    {
							 | 
						|
								        std::size_t count = 0;
							 | 
						|
								        auto t1 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        for (std::size_t i=0; i<iterations; ++i)
							 | 
						|
								        {
							 | 
						|
								            spp::sparse_hash_map<std::string,custom_type> m;
							 | 
						|
								            m.reserve(container_size);
							 | 
						|
								            for (std::size_t j=0; j<container_size; ++j)
							 | 
						|
								                m.emplace(patch::to_string(j),custom_type());
							 | 
						|
								            count += m.size();
							 | 
						|
								        }
							 | 
						|
								        auto t2 = std::chrono::high_resolution_clock::now();
							 | 
						|
								        auto elapsed = milliseconds<double>(t2 - t1).count();
							 | 
						|
								        if (count != iterations*container_size)
							 | 
						|
								            std::clog << "  invalid count: " << count << "\n";
							 | 
						|
								        std::clog << "  spp::sparse_hash_map:   " << std::fixed << int(elapsed) << " ms\n";
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								int main()
							 | 
						|
								{
							 | 
						|
								    std::size_t iterations = 100000;
							 | 
						|
								
							 | 
						|
								    test(iterations,1);
							 | 
						|
								    test(iterations,10);
							 | 
						|
								    test(iterations,50);
							 | 
						|
								}
							 |