/* Measuring running erasure times of unordered associative containers * without duplicate elements. * * Copyright 2013-2023 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) */ #include #include #include #include std::chrono::high_resolution_clock::time_point measure_start,measure_pause; template double measure(F f) { using namespace std::chrono; static const int num_trials=10; static const milliseconds min_time_per_trial(200); std::array trials; for(int i=0;i>(t2-measure_start).count()/runs; } std::sort(trials.begin(),trials.end()); return std::accumulate( trials.begin()+2,trials.end()-2,0.0)/(trials.size()-4); } void pause_timing() { measure_pause=std::chrono::high_resolution_clock::now(); } void resume_timing() { measure_start+=std::chrono::high_resolution_clock::now()-measure_pause; } #include #include #include #include #include static std::vector data,unsuccessful_data; static inline void initialize_data(unsigned int n) { std::uniform_int_distribution dist; std::mt19937_64 gen(34862); data.clear(); for(unsigned int i=0;i Container create(unsigned int n) { Container s; for(unsigned int i=0;i struct running_erasure { typedef unsigned int result_type; unsigned int operator()(const Container& s0)const { unsigned int res=0; { pause_timing(); Container s=s0; resume_timing(); for(auto first=s.begin(),last=s.end();first!=last;){ if(first->second%2){ s.erase(first++); ++res; } else{ ++first; } } pause_timing(); } resume_timing(); return res; } }; template boost::reference_wrapper temp_cref(T&& x) { return boost::cref(static_cast(x)); } template< template class Tester, typename Container1,typename Container2,typename Container3, typename Container4,typename Container5> void test( const char* title, const char* name1,const char* name2,const char* name3, const char* name4,const char* name5) { unsigned int n0=10000,n1=10000000,dn=500; double fdn=1.05; std::cout<()(create(n)); t=measure(boost::bind( Tester(), temp_cref(create(n)))); std::cout<(), temp_cref(create(n)))); std::cout<<";"<<(t/m)*1E9; t=measure(boost::bind( Tester(), temp_cref(create(n)))); std::cout<<";"<<(t/m)*1E9; t=measure(boost::bind( Tester(), temp_cref(create(n)))); std::cout<<";"<<(t/m)*1E9; t=measure(boost::bind( Tester(), temp_cref(create(n)))); std::cout<<";"<<(t/m)*1E9< #include #include int main() { using container_t1=absl::flat_hash_map; using container_t2=absl::node_hash_map; using container_t3=boost::unordered_map; using container_t4=boost::unordered_flat_map; using container_t5=boost::unordered_node_map; test< running_erasure, container_t1, container_t2, container_t3, container_t4, container_t5> ( "Running erasure", "absl::flat_hash_map", "absl::node_hash_map", "boost::unordered_map", "boost::unordered_flat_map", "boost::unordered_node_map" ); } #include "absl/container/internal/raw_hash_set.cc" #include "absl/hash/internal/hash.cc" #include "absl/hash/internal/low_level_hash.cc" #include "absl/hash/internal/city.cc"