diff --git a/libstdc++-v3/testsuite/performance/23_containers/insert/54075.cc b/libstdc++-v3/testsuite/performance/23_containers/insert/54075.cc index 8aa0cd20193..bb5778a257c 100644 --- a/libstdc++-v3/testsuite/performance/23_containers/insert/54075.cc +++ b/libstdc++-v3/testsuite/performance/23_containers/insert/54075.cc @@ -17,12 +17,14 @@ // { dg-do run { target c++11 } } -#include +#include #include #include #include #include +#include + #define USE_MY_FOO 1 struct Foo @@ -71,10 +73,13 @@ struct HashFunction }; const int sz = 300000; +const int usz = sz / 2; template void - bench(const char* container_desc, const typename _ContType::value_type* foos) + bench(const char* container_desc, + const typename _ContType::value_type* foos, + const typename _ContType::value_type* ufoos) { using namespace __gnu_test; @@ -106,6 +111,51 @@ template ostr << container_desc << nb_loop << " times insertion of " << sz << " elements"; report_performance(__FILE__, ostr.str().c_str(), time, resource); + + // Try to lookup for mostly unknown entries. + start_counters(time, resource); + + int fcount = 0; + for (int j = 0; j != nb_loop; ++j) + for (int i = 0; i != usz; ++i) + fcount += s.find(ufoos[i]) != s.end() ? 1 : 0; + + stop_counters(time, resource); + ostr.str(""); + ostr << container_desc << nb_loop << " times lookup of " + << usz << " elements " << fcount / nb_loop << " found"; + report_performance(__FILE__, ostr.str().c_str(), time, resource); + + // Try again the previous operations but on a copy with potentially + // less memory fragmentation. + _ContType scopy(s); + + // Try to insert again to check performance of collision detection + start_counters(time, resource); + + for (int j = 0; j != nb_loop; ++j) + for (int i = 0; i != sz; ++i) + scopy.insert(foos[i]); + + stop_counters(time, resource); + ostr.str(""); + ostr << container_desc << nb_loop << " times insertion of " + << sz << " elements in copy"; + report_performance(__FILE__, ostr.str().c_str(), time, resource); + + // Try to lookup for mostly unknown entries. + start_counters(time, resource); + + fcount = 0; + for (int j = 0; j != nb_loop; ++j) + for (int i = 0; i != usz; ++i) + fcount += scopy.find(ufoos[i]) != scopy.end() ? 1 : 0; + + stop_counters(time, resource); + ostr.str(""); + ostr << container_desc << nb_loop << " times lookup of " + << usz << " elements " << fcount / nb_loop << " found"; + report_performance(__FILE__, ostr.str().c_str(), time, resource); } template @@ -155,67 +205,78 @@ int main() { int bars[sz]; + int ubars[usz]; for (int i = 0; i != sz; ++i) bars[i] = i; + for (int i = 0; i != usz; ++i) + ubars[i] = sz + i; bench>( - "std::tr1::unordered_set ", bars); + "std::tr1::unordered_set ", bars, ubars); bench>( - "std::unordered_set ", bars); + "std::unordered_set ", bars, ubars); } - Foo foos[sz]; -#if USE_MY_FOO { - std::random_device randev; - for (int i = 0; i != sz; ++i) - foos[i].init(randev); - } + Foo foos[sz]; + Foo ufoos[usz]; +#if USE_MY_FOO + { + std::random_device randev; + for (int i = 0; i != sz; ++i) + foos[i].init(randev); + for (int i = 0; i != usz; ++i) + ufoos[i].init(randev); + } #endif - time_counter time; - resource_counter resource; - start_counters(time, resource); - - bench<__tr1_uset>( - "std::tr1::unordered_set without hash code cached ", foos); - bench<__tr1_uset>( - "std::tr1::unordered_set with hash code cached ", foos); - bench<__tr1_umset>( - "std::tr1::unordered_multiset without hash code cached ", foos); - bench<__tr1_umset>( - "std::tr1::unordered_multiset with hash code cached ", foos); - - stop_counters(time, resource); - report_performance(__FILE__, "tr1 benches", time, resource); - - start_counters(time, resource); - bench<__uset>( - "std::unordered_set without hash code cached ", foos); - bench<__uset>( - "std::unordered_set with hash code cached ", foos); - bench<__umset>( - "std::unordered_multiset without hash code cached ", foos); - bench<__umset>( - "std::unordered_multiset with hash code cached ", foos); - - stop_counters(time, resource); - report_performance(__FILE__, "std benches", time, resource); - - start_counters(time, resource); - bench<__uset2>( - "std::unordered_set2 without hash code cached ", foos); - bench<__uset2>( - "std::unordered_set2 with hash code cached ", foos); - bench<__umset2>( - "std::unordered_multiset2 without hash code cached ", foos); - bench<__umset2>( - "std::unordered_multiset2 with hash code cached ", foos); - - stop_counters(time, resource); - report_performance(__FILE__, "std2 benches", time, resource); - - bench>( - "std::unordered_set default cache ", foos); - bench>( - "std::unordered_multiset default cache ", foos); + time_counter time; + resource_counter resource; + start_counters(time, resource); + + bench<__tr1_uset>( + "std::tr1::unordered_set without hash code cached ", foos, ufoos); + bench<__tr1_uset>( + "std::tr1::unordered_set with hash code cached ", foos, ufoos); + bench<__tr1_umset>( + "std::tr1::unordered_multiset without hash code cached ", foos, ufoos); + bench<__tr1_umset>( + "std::tr1::unordered_multiset with hash code cached ", foos, ufoos); + + stop_counters(time, resource); + report_performance(__FILE__, "tr1 benches", time, resource); + + start_counters(time, resource); + bench<__uset>( + "std::unordered_set without hash code cached ", foos, ufoos); + bench<__uset>( + "std::unordered_set with hash code cached ", foos, ufoos); + bench<__umset>( + "std::unordered_multiset without hash code cached ", foos, ufoos); + bench<__umset>( + "std::unordered_multiset with hash code cached ", foos, ufoos); + + stop_counters(time, resource); + report_performance(__FILE__, "std benches", time, resource); + + start_counters(time, resource); + bench<__uset2>( + "std::unordered_set2 without hash code cached ", foos, ufoos); + bench<__uset2>( + "std::unordered_set2 with hash code cached ", foos, ufoos); + bench<__umset2>( + "std::unordered_multiset2 without hash code cached ", foos, ufoos); + bench<__umset2>( + "std::unordered_multiset2 with hash code cached ", foos, ufoos); + + stop_counters(time, resource); + report_performance(__FILE__, "std2 benches", time, resource); + + bench>( + "std::unordered_set default cache ", foos, ufoos); + bench>( + "std::unordered_multiset default cache ", foos, ufoos); + } + + { + } } diff --git a/libstdc++-v3/testsuite/performance/23_containers/insert_erase/unordered_small_size.cc b/libstdc++-v3/testsuite/performance/23_containers/insert_erase/unordered_small_size.cc index ae63c15b5da..a23b20bf69d 100644 --- a/libstdc++-v3/testsuite/performance/23_containers/insert_erase/unordered_small_size.cc +++ b/libstdc++-v3/testsuite/performance/23_containers/insert_erase/unordered_small_size.cc @@ -29,7 +29,7 @@ namespace const int nb_insts = 150000; template - void bench(const char* desc, const std::vector<_ElemType>& elems) + void bench(const char* desc, const std::vector<_ElemType>& elems, bool with_copy) { using namespace __gnu_test; @@ -52,6 +52,19 @@ namespace ostr << desc << " 1st insert"; report_performance(__FILE__, ostr.str().c_str(), time, resource); + if (with_copy) + { + start_counters(time, resource); + + std::vector>(insts).swap(insts); + + stop_counters(time, resource); + + ostr.str(""); + ostr << desc << " copy"; + report_performance(__FILE__, ostr.str().c_str(), time, resource); + } + start_counters(time, resource); for (auto& us : insts) @@ -103,7 +116,8 @@ int main() for (int i = 0; i != nb_elements; ++i) elems.push_back(i); - bench("std::unordered_set: ", elems); + bench("std::unordered_set: ", elems, false); + bench("std::unordered_set: ", elems, true); } { @@ -118,7 +132,8 @@ int main() } } - bench("std::unordered_set: ", elems); + bench("std::unordered_set: ", elems, false); + bench("std::unordered_set: ", elems, true); } return 0;