From a4c01881737043991c62896ad2f747a4a5c809f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Thu, 6 Feb 2014 11:13:22 +0100 Subject: [PATCH] Divided set benchmark in several smaller benchmark files --- bench/bench_flat_multiset.cpp | 29 + bench/bench_flat_set.cpp | 29 + bench/bench_set.cpp | 513 +----------------- bench/bench_set.hpp | 462 ++++++++++++++++ bench/bench_set_alloc_v2.cpp | 29 + bench/bench_set_avl.cpp | 38 ++ bench/bench_set_multi.cpp | 30 + bench/bench_set_sg.cpp | 28 + bench/bench_set_sp.cpp | 28 + include/boost/container/detail/mpl.hpp | 8 +- .../boost/container/detail/node_pool_impl.hpp | 6 +- include/boost/container/string.hpp | 15 +- include/boost/container/vector.hpp | 2 +- proj/to-do.txt | 4 +- proj/vc7ide/bench_flat_multiset.vcproj | 134 +++++ proj/vc7ide/bench_flat_set.vcproj | 134 +++++ proj/vc7ide/bench_set_alloc_v2.vcproj | 134 +++++ proj/vc7ide/bench_set_avl.vcproj | 134 +++++ proj/vc7ide/bench_set_multi.vcproj | 134 +++++ proj/vc7ide/bench_set_sg.vcproj | 134 +++++ proj/vc7ide/bench_set_sp.vcproj | 134 +++++ proj/vc7ide/container.sln | 56 ++ test/print_container.hpp | 5 +- 23 files changed, 1700 insertions(+), 520 deletions(-) create mode 100644 bench/bench_flat_multiset.cpp create mode 100644 bench/bench_flat_set.cpp create mode 100644 bench/bench_set.hpp create mode 100644 bench/bench_set_alloc_v2.cpp create mode 100644 bench/bench_set_avl.cpp create mode 100644 bench/bench_set_multi.cpp create mode 100644 bench/bench_set_sg.cpp create mode 100644 bench/bench_set_sp.cpp create mode 100644 proj/vc7ide/bench_flat_multiset.vcproj create mode 100644 proj/vc7ide/bench_flat_set.vcproj create mode 100644 proj/vc7ide/bench_set_alloc_v2.vcproj create mode 100644 proj/vc7ide/bench_set_avl.vcproj create mode 100644 proj/vc7ide/bench_set_multi.vcproj create mode 100644 proj/vc7ide/bench_set_sg.vcproj create mode 100644 proj/vc7ide/bench_set_sp.vcproj diff --git a/bench/bench_flat_multiset.cpp b/bench/bench_flat_multiset.cpp new file mode 100644 index 0000000..6ee7cca --- /dev/null +++ b/bench/bench_flat_multiset.cpp @@ -0,0 +1,29 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2013. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include "boost/container/set.hpp" +#include "boost/container/flat_set.hpp" +#include "bench_set.hpp" + +int main() +{ + using namespace boost::container; + + fill_range_ints(); + fill_range_strings(); + + //flat_set vs set + launch_tests< flat_multiset , multiset > + ("flat_multiset", "multiset"); + launch_tests< flat_multiset , multiset > + ("flat_multiset", "multiset"); + + return 0; +} diff --git a/bench/bench_flat_set.cpp b/bench/bench_flat_set.cpp new file mode 100644 index 0000000..8f86ba4 --- /dev/null +++ b/bench/bench_flat_set.cpp @@ -0,0 +1,29 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2013. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include "boost/container/set.hpp" +#include "boost/container/flat_set.hpp" +#include "bench_set.hpp" + +int main() +{ + using namespace boost::container; + + fill_range_ints(); + fill_range_strings(); + + //flat_set vs set + launch_tests< flat_set , set > + ("flat_set", "set"); + launch_tests< flat_set , set > + ("flat_set", "set"); + + return 0; +} diff --git a/bench/bench_set.cpp b/bench/bench_set.cpp index 5262760..890fd35 100644 --- a/bench/bench_set.cpp +++ b/bench/bench_set.cpp @@ -9,526 +9,27 @@ ////////////////////////////////////////////////////////////////////////////// #include "boost/container/set.hpp" -#include "boost/container/flat_set.hpp" -#include "boost/container/allocator.hpp" -#include -#include #include -#include -#include -#include -#include -#include -#include - -using boost::timer::cpu_timer; -using boost::timer::cpu_times; -using boost::timer::nanosecond_type; -using namespace boost::container; - -#ifdef NDEBUG -static const std::size_t N = 1000; -#else -static const std::size_t N = 100; -#endif - -void compare_times(cpu_times time_numerator, cpu_times time_denominator){ - std::cout << ((double)time_numerator.wall/(double)time_denominator.wall) << std::endl; - std::cout << "----------------------------------------------" << '\n' << std::endl; -} - -vector sorted_unique_range_int; -vector sorted_range_int; -vector random_unique_range_int; -vector random_range_int; - -void fill_range_ints() -{ - //sorted_unique_range_int - sorted_unique_range_int.resize(N); - for(std::size_t i = 0, max = sorted_unique_range_int.size(); i != max; ++i){ - sorted_unique_range_int[i] = static_cast(i); - } - //sorted_range_int - sorted_range_int = sorted_unique_range_int; - sorted_range_int.insert(sorted_range_int.end(), sorted_unique_range_int.begin(), sorted_unique_range_int.end()); - std::sort(sorted_range_int.begin(), sorted_range_int.end()); - - //random_range_int - std::srand(0); - random_range_int.assign(sorted_range_int.begin(), sorted_range_int.end()); - std::random_shuffle(random_range_int.begin(), random_range_int.end()); - //random_unique_range_int - std::srand(0); - random_unique_range_int.assign(sorted_unique_range_int.begin(), sorted_unique_range_int.end()); - std::random_shuffle(random_unique_range_int.begin(), random_unique_range_int.end()); -} - -vector sorted_unique_range_string; -vector sorted_range_string; -vector random_unique_range_string; -vector random_range_string; - -void fill_range_strings() -{ - //sorted_unique_range_int - sorted_unique_range_string.resize(N); - for(std::size_t i = 0, max = sorted_unique_range_string.size(); i != max; ++i){ - std::stringstream sstr; - sstr << std::setfill('0') << std::setw(10) << i; - sorted_unique_range_string[i] = "really_long_long_prefix_to_ssb_and_increase_comparison_costs_"; - const std::string &s = sstr.str(); - sorted_unique_range_string[i].append(s.begin(), s.end()); - } - //sorted_range_string - sorted_range_string = sorted_unique_range_string; - sorted_range_string.insert(sorted_range_string.end(), sorted_unique_range_string.begin(), sorted_unique_range_string.end()); - std::sort(sorted_range_string.begin(), sorted_range_string.end()); - - //random_range_string - std::srand(0); - random_range_string.assign(sorted_range_string.begin(), sorted_range_string.end()); - std::random_shuffle(random_range_string.begin(), random_range_string.end()); - //random_unique_range_string - std::srand(0); - random_unique_range_string.assign(sorted_unique_range_string.begin(), sorted_unique_range_string.end()); - std::random_shuffle(random_unique_range_string.begin(), random_unique_range_string.end()); -} - -template -struct range_provider; - -template<> -struct range_provider -{ - typedef vector type; - - static type &sorted_unique() - { return sorted_unique_range_int; } - - static type &sorted() - { return sorted_range_int; } - - static type &random_unique() - { return random_unique_range_int; } - - static type &random() - { return random_range_int; } -}; - -template<> -struct range_provider -{ - typedef vector type; - - static type &sorted_unique() - { return sorted_unique_range_string; } - - static type &sorted() - { return sorted_range_string; } - - static type &random_unique() - { return random_unique_range_string; } - - static type &random() - { return random_range_string; } -}; - -template -cpu_times copy_destroy_time(vector &unique_range) -{ - cpu_timer copy_timer, assign_timer, destroy_timer; - - cpu_timer total_time; - - for(std::size_t i = 0; i != N; ++i){ - { - C c(unique_range.begin(), unique_range.end()); - total_time.resume(); - copy_timer.resume(); - C caux(c); - copy_timer.stop(); - assign_timer.resume(); - c = caux; - assign_timer.stop(); - destroy_timer.resume(); - } - destroy_timer.stop(); - total_time.stop(); - } - total_time.stop(); - - std::cout << " Copy sorted range " << boost::timer::format(copy_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Assign sorted range " << boost::timer::format(assign_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Destroy " << boost::timer::format(destroy_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; - return total_time.elapsed(); -} - -template -cpu_times construct_time(vector &unique_range, vector &range, const char *RangeType) -{ - cpu_timer sur_timer, sr_timer; - - cpu_timer total_time; - - for(std::size_t i = 0; i != N; ++i){ - { - sur_timer.resume(); - total_time.resume(); - C c(unique_range.begin(), unique_range.end()); - sur_timer.stop(); - total_time.stop(); - } - { - total_time.resume(); - sr_timer.resume(); - C c(range.begin(), range.end()); - sr_timer.stop(); - total_time.stop(); - } - } - - std::cout << " Construct " << RangeType << " unique_range " << boost::timer::format(sur_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Construct " << RangeType << " range " << boost::timer::format(sr_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; - return total_time.elapsed(); -} - -template -cpu_times insert_time(vector &unique_range, vector &range, const char *RangeType) -{ - cpu_timer ur_timer,r_timer; - ur_timer.stop();r_timer.stop(); - - cpu_timer total_time; - total_time.resume(); - - for(std::size_t i = 0; i != N; ++i){ - { - total_time.resume(); - ur_timer.resume(); - C c; - c.insert(unique_range.begin(), unique_range.end()); - ur_timer.stop(); - total_time.stop(); - } - { - total_time.resume(); - r_timer.resume(); - C c; - c.insert(range.begin(), range.end()); - r_timer.stop(); - total_time.stop(); - } - } - - std::cout << " Insert " << RangeType << " unique_range " << boost::timer::format(ur_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Insert " << RangeType << " range " << boost::timer::format(r_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; - return total_time.elapsed(); -} - -template -bool check_not_end(vector &iterators, Iterator itend, std::size_t number_of_ends = 0) -{ - std::size_t end_count = 0; - for(std::size_t i = 0, max = iterators.size(); i != max; ++i){ - if(iterators[i] == itend && (++end_count > number_of_ends) ) - return false; - } - return true; -} - -template -bool check_all_not_empty(vector< std::pair > &iterator_pairs) -{ - for(std::size_t i = 0, max = iterator_pairs.size(); i != max; ++i){ - if(iterator_pairs[i].first == iterator_pairs[i].second) - return false; - } - return true; -} - -template -cpu_times search_time(vector &unique_range, const char *RangeType) -{ - cpu_timer find_timer, lower_timer, upper_timer, equal_range_timer, count_timer; - - C c(unique_range.begin(), unique_range.end()); - - cpu_timer total_time; - total_time.resume(); - - vector v_it(N); - vector< std::pair > v_itp(N); - - for(std::size_t i = 0; i != N; ++i){ - //Find - { - find_timer.resume(); - for(std::size_t rep = 0; rep != 2; ++rep) - for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ - v_it[i] = c.find(unique_range[i]); - } - find_timer.stop(); - if(!check_not_end(v_it, c.end())){ - std::cout << "ERROR! find all elements not found" << std::endl; - } - } - //Lower - { - lower_timer.resume(); - for(std::size_t rep = 0; rep != 2; ++rep) - for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ - v_it[i] = c.lower_bound(unique_range[i]); - } - lower_timer.stop(); - if(!check_not_end(v_it, c.end())){ - std::cout << "ERROR! lower_bound all elements not found" << std::endl; - } - } - //Upper - { - upper_timer.resume(); - for(std::size_t rep = 0; rep != 2; ++rep) - for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ - v_it[i] = c.upper_bound(unique_range[i]); - } - upper_timer.stop(); - if(!check_not_end(v_it, c.end(), 1u)){ - std::cout << "ERROR! upper_bound all elements not found" << std::endl; - } - } - //Equal - { - equal_range_timer.resume(); - for(std::size_t rep = 0; rep != 2; ++rep) - for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ - v_itp[i] = c.equal_range(unique_range[i]); - } - equal_range_timer.stop(); - if(!check_all_not_empty(v_itp)){ - std::cout << "ERROR! equal_range all elements not found" << std::endl; - } - } - //Count - { - std::size_t count = 0; - count_timer.resume(); - for(std::size_t rep = 0; rep != 2; ++rep) - for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ - count += c.count(unique_range[i]); - } - count_timer.stop(); - if(count/2 != c.size()){ - std::cout << "ERROR! count all elements not found" << std::endl; - } - } - } - total_time.stop(); - - std::cout << " Find " << RangeType << " " << boost::timer::format(find_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Lower Bound " << RangeType << " " << boost::timer::format(lower_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Upper Bound " << RangeType << " " << boost::timer::format(upper_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Equal Range " << RangeType << " " << boost::timer::format(equal_range_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Count " << RangeType << " " << boost::timer::format(count_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; - return total_time.elapsed(); -} - -template -void extensions_time(vector &sorted_unique_range) -{ - cpu_timer sur_timer,sur_opt_timer; - sur_timer.stop();sur_opt_timer.stop(); - - for(std::size_t i = 0; i != N; ++i){ - { - sur_timer.resume(); - C c(sorted_unique_range.begin(), sorted_unique_range.end()); - sur_timer.stop(); - } - { - sur_opt_timer.resume(); - C c(boost::container::ordered_unique_range, sorted_unique_range.begin(), sorted_unique_range.end()); - sur_opt_timer.stop(); - } - - } - std::cout << " Construct sorted_unique_range " << boost::timer::format(sur_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << " Construct sorted_unique_range (extension) " << boost::timer::format(sur_opt_timer.elapsed(), boost::timer::default_places, "%ws\n"); - std::cout << "Extension/Standard: "; - compare_times(sur_opt_timer.elapsed(), sur_timer.elapsed()); -} - -template -void launch_tests(const char *BoostContName, const char *StdContName) -{ - typedef range_provider get_range_t; - try { - std::cout << "**********************************************" << '\n'; - std::cout << "**********************************************" << '\n'; - std::cout << '\n'; - std::cout << BoostContName << " .VS " << StdContName << '\n'; - std::cout << '\n'; - std::cout << "**********************************************" << '\n'; - std::cout << "**********************************************" << '\n' << std::endl; - { - std::cout << "Copy/Assign/Destroy benchmark:" << BoostContName << std::endl; - cpu_times boost_set_time = copy_destroy_time< BoostClass >(get_range_t::sorted_unique()); - - std::cout << "Copy/Assign/Destroy benchmark:" << StdContName << std::endl; - cpu_times std_set_time = copy_destroy_time< StdClass >(get_range_t::sorted_unique()); - - std::cout << BoostContName << "/" << StdContName << ": "; - compare_times(boost_set_time, std_set_time); - } - { - std::cout << "Ordered construct benchmark:" << BoostContName << std::endl; - cpu_times boost_set_time = construct_time< BoostClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)"); - - std::cout << "Ordered construct benchmark:" << StdContName << std::endl; - cpu_times std_set_time = construct_time< StdClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)");; - - std::cout << BoostContName << "/" << StdContName << ": "; - compare_times(boost_set_time, std_set_time); - } - { - std::cout << "Random construct benchmark:" << BoostContName << std::endl; - cpu_times boost_set_time = construct_time< BoostClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)"); - - std::cout << "Random construct benchmark:" << StdContName << std::endl; - cpu_times std_set_time = construct_time< StdClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)");; - - std::cout << BoostContName << "/" << StdContName << ": "; - compare_times(boost_set_time, std_set_time); - } - { - std::cout << "Ordered Insert benchmark:" << BoostContName << std::endl; - cpu_times boost_set_time = insert_time< BoostClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)"); - - std::cout << "Ordered Insert benchmark:" << StdContName << std::endl; - cpu_times std_set_time = insert_time< StdClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)"); - - std::cout << BoostContName << "/" << StdContName << ": "; - compare_times(boost_set_time, std_set_time); - } - { - std::cout << "Random Insert benchmark:" << BoostContName << std::endl; - cpu_times boost_set_time = insert_time< BoostClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)"); - - std::cout << "Random Insert benchmark:" << StdContName << std::endl; - cpu_times std_set_time = insert_time< StdClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)"); - - std::cout << BoostContName << "/" << StdContName << ": "; - compare_times(boost_set_time, std_set_time); - } - { - std::cout << "Ordered Search benchmark:" << BoostContName << std::endl; - cpu_times boost_set_time = search_time< BoostClass >(get_range_t::sorted_unique(), "(ord)"); - - std::cout << "Ordered Search benchmark:" << StdContName << std::endl; - cpu_times std_set_time = search_time< StdClass >(get_range_t::sorted_unique(), "(ord)"); - - std::cout << BoostContName << "/" << StdContName << ": "; - compare_times(boost_set_time, std_set_time); - } - { - std::cout << "Random Search benchmark:" << BoostContName << std::endl; - cpu_times boost_set_time = search_time< BoostClass >(get_range_t::random_unique(), "(rnd)"); - - std::cout << "Random Search benchmark:" << StdContName << std::endl; - cpu_times std_set_time = search_time< StdClass >(get_range_t::random_unique(), "(rnd)"); - - std::cout << BoostContName << "/" << StdContName << ": "; - compare_times(boost_set_time, std_set_time); - } - { - std::cout << "Extensions benchmark:" << BoostContName << std::endl; - extensions_time< BoostClass >(get_range_t::sorted_unique()); - } - - }catch(std::exception e){ - std::cout << e.what(); - } -} +#include "bench_set.hpp" int main() { using namespace boost::container; - ////////////////////////////////// - // INT - ////////////////////////////////// fill_range_ints(); - //set vs std::set - launch_tests< set , std::set > - ("set", "std::set"); - //set(RB) vs set(AVL) - launch_tests< set, set, std::allocator, tree_assoc_options< tree_type >::type > > - ("set(RB)", "set(AVL)"); - //set(RB) vs set(SG) - launch_tests< set, set, std::allocator, tree_assoc_options< tree_type >::type > > - ("set(RB)", "set(SG)"); - //set(RB) vs set(SP) - launch_tests< set, set, std::allocator, tree_assoc_options< tree_type >::type > > - ("set(RB)", "set(SP)"); - //set(sizeopt) vs set(!sizeopt) - launch_tests< set, set, std::allocator, tree_assoc_options< optimize_size >::type > > - ("set(sizeopt=true)", "set(sizeopt=false)"); - //set(AVL,sizeopt) vs set(AVL,!sizeopt) - launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type > - , set, std::allocator, tree_assoc_options< tree_type, optimize_size >::type > > - ("set(AVL,sizeopt=true)", "set(AVL,sizeopt=false)"); - //set vs set<..., allocator_v2> - launch_tests< set , set, allocator > > - ("set", "set" ); - //multiset vs std::set - launch_tests< multiset , std::multiset > - ("multiset", "std::multiset"); - //flat_set vs set - launch_tests< flat_set , set > - ("flat_set", "set"); - //flat_multiset vs multiset - launch_tests< flat_multiset , multiset > - ("flat_multiset", "multiset"); - - ////////////////////////////////// - // STRING - ////////////////////////////////// fill_range_strings(); //set vs std::set + launch_tests< set , std::set > + ("set", "std::set"); launch_tests< set , std::set > ("set", "std::set"); - //set(RB) vs set(AVL) - launch_tests< set, set, std::allocator, tree_assoc_options< tree_type >::type > > - ("set(RB)", "set(AVL)"); - //set(RB) vs set(SG) - launch_tests< set, set, std::allocator, tree_assoc_options< tree_type >::type > > - ("set(RB)", "set(SG)"); - //set(RB) vs set(SP) - launch_tests< set, set, std::allocator, tree_assoc_options< tree_type >::type > > - ("set(RB)", "set(SP)"); + //set(sizeopt) vs set(!sizeopt) + launch_tests< set, set, std::allocator, tree_assoc_options< optimize_size >::type > > + ("set(sizeopt=true)", "set(sizeopt=false)"); launch_tests< set, set, std::allocator, tree_assoc_options< optimize_size >::type > > ("set(sizeopt=true)", "set(sizeopt=false)"); - //set(AVL,sizeopt) vs set(AVL,!sizeopt) - launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type > - , set, std::allocator, tree_assoc_options< tree_type, optimize_size >::type > > - ("set(AVL,sizeopt=true)", "set(AVL,sizeopt=false)"); - //set vs set<..., allocator_v2> - launch_tests< set , set, allocator > > - ("set", "set" ); - //multiset vs std::set - launch_tests< multiset , std::multiset > - ("multiset", "std::multiset"); - //flat_set vs set - launch_tests< flat_set , set > - ("flat_set", "set"); - //flat_multiset vs multiset - launch_tests< flat_multiset , multiset > - ("flat_multiset", "multiset"); + return 0; } diff --git a/bench/bench_set.hpp b/bench/bench_set.hpp new file mode 100644 index 0000000..f606b38 --- /dev/null +++ b/bench/bench_set.hpp @@ -0,0 +1,462 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2014. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_CONTAINER_BENCH_BENCH_SET_HPP +#define BOOST_CONTAINER_BENCH_BENCH_SET_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +using boost::timer::cpu_timer; +using boost::timer::cpu_times; +using boost::timer::nanosecond_type; +using namespace boost::container; + +#ifdef NDEBUG +static const std::size_t NElements = 1000; +#else +static const std::size_t NElements = 100; +#endif + +#ifdef NDEBUG +static const std::size_t NIter = 500; +#else +static const std::size_t NIter = 50; +#endif + +void compare_times(cpu_times time_numerator, cpu_times time_denominator){ + std::cout << ((double)time_numerator.wall/(double)time_denominator.wall) << std::endl; + std::cout << "----------------------------------------------" << '\n' << std::endl; +} + +vector sorted_unique_range_int; +vector sorted_range_int; +vector random_unique_range_int; +vector random_range_int; + +void fill_range_ints() +{ + //sorted_unique_range_int + sorted_unique_range_int.resize(NElements); + for(std::size_t i = 0, max = sorted_unique_range_int.size(); i != max; ++i){ + sorted_unique_range_int[i] = static_cast(i); + } + //sorted_range_int + sorted_range_int = sorted_unique_range_int; + sorted_range_int.insert(sorted_range_int.end(), sorted_unique_range_int.begin(), sorted_unique_range_int.end()); + std::sort(sorted_range_int.begin(), sorted_range_int.end()); + + //random_range_int + std::srand(0); + random_range_int.assign(sorted_range_int.begin(), sorted_range_int.end()); + std::random_shuffle(random_range_int.begin(), random_range_int.end()); + //random_unique_range_int + std::srand(0); + random_unique_range_int.assign(sorted_unique_range_int.begin(), sorted_unique_range_int.end()); + std::random_shuffle(random_unique_range_int.begin(), random_unique_range_int.end()); +} + +vector sorted_unique_range_string; +vector sorted_range_string; +vector random_unique_range_string; +vector random_range_string; + +void fill_range_strings() +{ + //sorted_unique_range_int + sorted_unique_range_string.resize(NElements); + for(std::size_t i = 0, max = sorted_unique_range_string.size(); i != max; ++i){ + std::stringstream sstr; + sstr << std::setfill('0') << std::setw(10) << i; + sorted_unique_range_string[i] = "really_long_long_prefix_to_ssb_and_increase_comparison_costs_"; + const std::string &s = sstr.str(); + sorted_unique_range_string[i].append(s.begin(), s.end()); + } + //sorted_range_string + sorted_range_string = sorted_unique_range_string; + sorted_range_string.insert(sorted_range_string.end(), sorted_unique_range_string.begin(), sorted_unique_range_string.end()); + std::sort(sorted_range_string.begin(), sorted_range_string.end()); + + //random_range_string + std::srand(0); + random_range_string.assign(sorted_range_string.begin(), sorted_range_string.end()); + std::random_shuffle(random_range_string.begin(), random_range_string.end()); + //random_unique_range_string + std::srand(0); + random_unique_range_string.assign(sorted_unique_range_string.begin(), sorted_unique_range_string.end()); + std::random_shuffle(random_unique_range_string.begin(), random_unique_range_string.end()); +} + +template +struct range_provider; + +template<> +struct range_provider +{ + typedef vector type; + + static type &sorted_unique() + { return sorted_unique_range_int; } + + static type &sorted() + { return sorted_range_int; } + + static type &random_unique() + { return random_unique_range_int; } + + static type &random() + { return random_range_int; } +}; + +template<> +struct range_provider +{ + typedef vector type; + + static type &sorted_unique() + { return sorted_unique_range_string; } + + static type &sorted() + { return sorted_range_string; } + + static type &random_unique() + { return random_unique_range_string; } + + static type &random() + { return random_range_string; } +}; + +template +cpu_times copy_destroy_time(vector &unique_range) +{ + cpu_timer copy_timer, assign_timer, destroy_timer; + + cpu_timer total_time; + + for(std::size_t i = 0; i != NIter; ++i){ + { + C c(unique_range.begin(), unique_range.end()); + total_time.resume(); + copy_timer.resume(); + C caux(c); + copy_timer.stop(); + assign_timer.resume(); + c = caux; + assign_timer.stop(); + destroy_timer.resume(); + } + destroy_timer.stop(); + total_time.stop(); + } + total_time.stop(); + + std::cout << " Copy sorted range " << boost::timer::format(copy_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Assign sorted range " << boost::timer::format(assign_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Destroy " << boost::timer::format(destroy_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; + return total_time.elapsed(); +} + +template +cpu_times construct_time(vector &unique_range, vector &range, const char *RangeType) +{ + cpu_timer sur_timer, sr_timer; + + cpu_timer total_time; + + for(std::size_t i = 0; i != NIter; ++i){ + { + sur_timer.resume(); + total_time.resume(); + C c(unique_range.begin(), unique_range.end()); + sur_timer.stop(); + total_time.stop(); + } + { + total_time.resume(); + sr_timer.resume(); + C c(range.begin(), range.end()); + sr_timer.stop(); + total_time.stop(); + } + } + + std::cout << " Construct " << RangeType << " unique_range " << boost::timer::format(sur_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Construct " << RangeType << " range " << boost::timer::format(sr_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; + return total_time.elapsed(); +} + +template +cpu_times insert_time(vector &unique_range, vector &range, const char *RangeType) +{ + cpu_timer ur_timer,r_timer; + ur_timer.stop();r_timer.stop(); + + cpu_timer total_time; + total_time.resume(); + + for(std::size_t i = 0; i != NIter; ++i){ + { + total_time.resume(); + ur_timer.resume(); + C c; + c.insert(unique_range.begin(), unique_range.end()); + ur_timer.stop(); + total_time.stop(); + } + { + total_time.resume(); + r_timer.resume(); + C c; + c.insert(range.begin(), range.end()); + r_timer.stop(); + total_time.stop(); + } + } + + std::cout << " Insert " << RangeType << " unique_range " << boost::timer::format(ur_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Insert " << RangeType << " range " << boost::timer::format(r_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; + return total_time.elapsed(); +} + +template +bool check_not_end(vector &iterators, Iterator itend, std::size_t number_of_ends = 0) +{ + std::size_t end_count = 0; + for(std::size_t i = 0, max = iterators.size(); i != max; ++i){ + if(iterators[i] == itend && (++end_count > number_of_ends) ) + return false; + } + return true; +} + +template +bool check_all_not_empty(vector< std::pair > &iterator_pairs) +{ + for(std::size_t i = 0, max = iterator_pairs.size(); i != max; ++i){ + if(iterator_pairs[i].first == iterator_pairs[i].second) + return false; + } + return true; +} + +template +cpu_times search_time(vector &unique_range, const char *RangeType) +{ + cpu_timer find_timer, lower_timer, upper_timer, equal_range_timer, count_timer; + + C c(unique_range.begin(), unique_range.end()); + + cpu_timer total_time; + total_time.resume(); + + vector v_it(NElements); + vector< std::pair > v_itp(NElements); + + for(std::size_t i = 0; i != NIter; ++i){ + //Find + { + find_timer.resume(); + for(std::size_t rep = 0; rep != 2; ++rep) + for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ + v_it[i] = c.find(unique_range[i]); + } + find_timer.stop(); + if(!check_not_end(v_it, c.end())){ + std::cout << "ERROR! find all elements not found" << std::endl; + } + } + //Lower + { + lower_timer.resume(); + for(std::size_t rep = 0; rep != 2; ++rep) + for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ + v_it[i] = c.lower_bound(unique_range[i]); + } + lower_timer.stop(); + if(!check_not_end(v_it, c.end())){ + std::cout << "ERROR! lower_bound all elements not found" << std::endl; + } + } + //Upper + { + upper_timer.resume(); + for(std::size_t rep = 0; rep != 2; ++rep) + for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ + v_it[i] = c.upper_bound(unique_range[i]); + } + upper_timer.stop(); + if(!check_not_end(v_it, c.end(), 1u)){ + std::cout << "ERROR! upper_bound all elements not found" << std::endl; + } + } + //Equal + { + equal_range_timer.resume(); + for(std::size_t rep = 0; rep != 2; ++rep) + for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ + v_itp[i] = c.equal_range(unique_range[i]); + } + equal_range_timer.stop(); + if(!check_all_not_empty(v_itp)){ + std::cout << "ERROR! equal_range all elements not found" << std::endl; + } + } + //Count + { + std::size_t count = 0; + count_timer.resume(); + for(std::size_t rep = 0; rep != 2; ++rep) + for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ + count += c.count(unique_range[i]); + } + count_timer.stop(); + if(count/2 != c.size()){ + std::cout << "ERROR! count all elements not found" << std::endl; + } + } + } + total_time.stop(); + + std::cout << " Find " << RangeType << " " << boost::timer::format(find_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Lower Bound " << RangeType << " " << boost::timer::format(lower_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Upper Bound " << RangeType << " " << boost::timer::format(upper_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Equal Range " << RangeType << " " << boost::timer::format(equal_range_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Count " << RangeType << " " << boost::timer::format(count_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; + return total_time.elapsed(); +} + +template +void extensions_time(vector &sorted_unique_range) +{ + cpu_timer sur_timer,sur_opt_timer; + sur_timer.stop();sur_opt_timer.stop(); + + for(std::size_t i = 0; i != NIter; ++i){ + { + sur_timer.resume(); + C c(sorted_unique_range.begin(), sorted_unique_range.end()); + sur_timer.stop(); + } + { + sur_opt_timer.resume(); + C c(boost::container::ordered_unique_range, sorted_unique_range.begin(), sorted_unique_range.end()); + sur_opt_timer.stop(); + } + + } + std::cout << " Construct sorted_unique_range " << boost::timer::format(sur_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << " Construct sorted_unique_range (extension) " << boost::timer::format(sur_opt_timer.elapsed(), boost::timer::default_places, "%ws\n"); + std::cout << "Extension/Standard: "; + compare_times(sur_opt_timer.elapsed(), sur_timer.elapsed()); +} + +template +void launch_tests(const char *BoostContName, const char *StdContName) +{ + typedef range_provider get_range_t; + try { + std::cout << "**********************************************" << '\n'; + std::cout << "**********************************************" << '\n'; + std::cout << '\n'; + std::cout << BoostContName << " .VS " << StdContName << '\n'; + std::cout << '\n'; + std::cout << "**********************************************" << '\n'; + std::cout << "**********************************************" << '\n' << std::endl; + { + std::cout << "Copy/Assign/Destroy benchmark:" << BoostContName << std::endl; + cpu_times boost_set_time = copy_destroy_time< BoostClass >(get_range_t::sorted_unique()); + + std::cout << "Copy/Assign/Destroy benchmark:" << StdContName << std::endl; + cpu_times std_set_time = copy_destroy_time< StdClass >(get_range_t::sorted_unique()); + + std::cout << BoostContName << "/" << StdContName << ": "; + compare_times(boost_set_time, std_set_time); + } + { + std::cout << "Ordered construct benchmark:" << BoostContName << std::endl; + cpu_times boost_set_time = construct_time< BoostClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)"); + + std::cout << "Ordered construct benchmark:" << StdContName << std::endl; + cpu_times std_set_time = construct_time< StdClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)");; + + std::cout << BoostContName << "/" << StdContName << ": "; + compare_times(boost_set_time, std_set_time); + } + { + std::cout << "Random construct benchmark:" << BoostContName << std::endl; + cpu_times boost_set_time = construct_time< BoostClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)"); + + std::cout << "Random construct benchmark:" << StdContName << std::endl; + cpu_times std_set_time = construct_time< StdClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)");; + + std::cout << BoostContName << "/" << StdContName << ": "; + compare_times(boost_set_time, std_set_time); + } + { + std::cout << "Ordered Insert benchmark:" << BoostContName << std::endl; + cpu_times boost_set_time = insert_time< BoostClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)"); + + std::cout << "Ordered Insert benchmark:" << StdContName << std::endl; + cpu_times std_set_time = insert_time< StdClass >(get_range_t::sorted_unique(), get_range_t::sorted(), "(ord)"); + + std::cout << BoostContName << "/" << StdContName << ": "; + compare_times(boost_set_time, std_set_time); + } + { + std::cout << "Random Insert benchmark:" << BoostContName << std::endl; + cpu_times boost_set_time = insert_time< BoostClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)"); + + std::cout << "Random Insert benchmark:" << StdContName << std::endl; + cpu_times std_set_time = insert_time< StdClass >(get_range_t::random_unique(), get_range_t::random(), "(rnd)"); + + std::cout << BoostContName << "/" << StdContName << ": "; + compare_times(boost_set_time, std_set_time); + } + { + std::cout << "Ordered Search benchmark:" << BoostContName << std::endl; + cpu_times boost_set_time = search_time< BoostClass >(get_range_t::sorted_unique(), "(ord)"); + + std::cout << "Ordered Search benchmark:" << StdContName << std::endl; + cpu_times std_set_time = search_time< StdClass >(get_range_t::sorted_unique(), "(ord)"); + + std::cout << BoostContName << "/" << StdContName << ": "; + compare_times(boost_set_time, std_set_time); + } + { + std::cout << "Random Search benchmark:" << BoostContName << std::endl; + cpu_times boost_set_time = search_time< BoostClass >(get_range_t::random_unique(), "(rnd)"); + + std::cout << "Random Search benchmark:" << StdContName << std::endl; + cpu_times std_set_time = search_time< StdClass >(get_range_t::random_unique(), "(rnd)"); + + std::cout << BoostContName << "/" << StdContName << ": "; + compare_times(boost_set_time, std_set_time); + } + { + std::cout << "Extensions benchmark:" << BoostContName << std::endl; + extensions_time< BoostClass >(get_range_t::sorted_unique()); + } + + }catch(std::exception e){ + std::cout << e.what(); + } +} + +#endif //#ifndef BOOST_CONTAINER_BENCH_BENCH_SET_HPP diff --git a/bench/bench_set_alloc_v2.cpp b/bench/bench_set_alloc_v2.cpp new file mode 100644 index 0000000..b927590 --- /dev/null +++ b/bench/bench_set_alloc_v2.cpp @@ -0,0 +1,29 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2013. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include "boost/container/set.hpp" +#include "boost/container/allocator.hpp" +#include "bench_set.hpp" + +int main() +{ + using namespace boost::container; + + fill_range_ints(); + fill_range_strings(); + + //set<..., allocator_v2> vs. set + launch_tests< set, allocator >, set > + ("set", "set"); + launch_tests< set, allocator >, set > + ("set", "set"); + + return 0; +} diff --git a/bench/bench_set_avl.cpp b/bench/bench_set_avl.cpp new file mode 100644 index 0000000..6d0d77d --- /dev/null +++ b/bench/bench_set_avl.cpp @@ -0,0 +1,38 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2013. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include "boost/container/set.hpp" +#include + +#include "bench_set.hpp" + +int main() +{ + using namespace boost::container; + + fill_range_ints(); + fill_range_strings(); + + //set(AVL) vs set(RB) + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type >, set > + ("set(AVL)", "set(RB)"); + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type >, set > + ("set(AVL)", "set(RB)"); + + //set(AVL,sizeopt) vs set(AVL,!sizeopt) + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type > + , set, std::allocator, tree_assoc_options< tree_type, optimize_size >::type > > + ("set(AVL,sizeopt=true)", "set(AVL,sizeopt=false)"); + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type > + , set, std::allocator, tree_assoc_options< tree_type, optimize_size >::type > > + ("set(AVL,sizeopt=true)", "set(AVL,sizeopt=false)"); + + return 0; +} diff --git a/bench/bench_set_multi.cpp b/bench/bench_set_multi.cpp new file mode 100644 index 0000000..a01dbc9 --- /dev/null +++ b/bench/bench_set_multi.cpp @@ -0,0 +1,30 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2013. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include "boost/container/set.hpp" +#include + +#include "bench_set.hpp" + +int main() +{ + using namespace boost::container; + + fill_range_ints(); + fill_range_strings(); + + //multiset vs std::multiset + launch_tests< multiset , std::multiset > + ("multiset", "std::multiset"); + launch_tests< multiset , std::multiset > + ("multiset", "std::multiset"); + + return 0; +} diff --git a/bench/bench_set_sg.cpp b/bench/bench_set_sg.cpp new file mode 100644 index 0000000..c988438 --- /dev/null +++ b/bench/bench_set_sg.cpp @@ -0,0 +1,28 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2013. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include "boost/container/set.hpp" +#include "bench_set.hpp" + +int main() +{ + using namespace boost::container; + + fill_range_ints(); + fill_range_strings(); + + //set(RB) vs set(SG) + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type >, set > + ("set(SG)", "set(RB)"); + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type >, set > + ("set(SG)", "set(RB)"); + + return 0; +} diff --git a/bench/bench_set_sp.cpp b/bench/bench_set_sp.cpp new file mode 100644 index 0000000..0f86ed4 --- /dev/null +++ b/bench/bench_set_sp.cpp @@ -0,0 +1,28 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-2013. 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) +// +// See http://www.boost.org/libs/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include "boost/container/set.hpp" +#include "bench_set.hpp" + +int main() +{ + using namespace boost::container; + + fill_range_ints(); + fill_range_strings(); + + //set(RB) vs set(SP) + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type >, set > + ("set(SP)", "set(RB)"); + launch_tests< set, std::allocator, tree_assoc_options< tree_type >::type >, set > + ("set(SP)", "set(RB)"); + + return 0; +} diff --git a/include/boost/container/detail/mpl.hpp b/include/boost/container/detail/mpl.hpp index e25d623..941e5ee 100644 --- a/include/boost/container/detail/mpl.hpp +++ b/include/boost/container/detail/mpl.hpp @@ -113,8 +113,10 @@ struct if_ template struct select1st -// : public std::unary_function { + typedef Pair argument_type; + typedef typename Pair::first_type result_type; + template const typename Pair::first_type& operator()(const OtherPair& x) const { return x.first; } @@ -126,8 +128,10 @@ struct select1st // identity is an extension: it is not part of the standard. template struct identity -// : public std::unary_function { + typedef T argument_type; + typedef T result_type; + typedef T type; const T& operator()(const T& x) const { return x; } diff --git a/include/boost/container/detail/node_pool_impl.hpp b/include/boost/container/detail/node_pool_impl.hpp index f10e9bc..b7f5996 100644 --- a/include/boost/container/detail/node_pool_impl.hpp +++ b/include/boost/container/detail/node_pool_impl.hpp @@ -30,8 +30,6 @@ #include #include #include -#include //std::unary_function - namespace boost { namespace container { @@ -252,8 +250,10 @@ class private_node_pool_impl }; struct is_between - : std::unary_function { + typedef typename free_nodes_t::value_type argument_type; + typedef bool result_type; + is_between(const void *addr, std::size_t size) : beg_(static_cast(addr)), end_(beg_+size) {} diff --git a/include/boost/container/string.hpp b/include/boost/container/string.hpp index 190c12f..982ba4a 100644 --- a/include/boost/container/string.hpp +++ b/include/boost/container/string.hpp @@ -492,19 +492,22 @@ class basic_string template struct Eq_traits - : public std::binary_function { - bool operator()(const typename Tr::char_type& x, - const typename Tr::char_type& y) const + //Compatibility with std::binary_function + typedef typename Tr::char_type first_argument_type; + typedef typename Tr::char_type second_argument_type; + typedef bool result_type; + + bool operator()(const first_argument_type& x, const second_argument_type& y) const { return Tr::eq(x, y); } }; template struct Not_within_traits - : public std::unary_function { + typedef typename Tr::char_type argument_type; + typedef bool result_type; + typedef const typename Tr::char_type* Pointer; const Pointer m_first; const Pointer m_last; diff --git a/include/boost/container/vector.hpp b/include/boost/container/vector.hpp index f4da906..e706ac9 100644 --- a/include/boost/container/vector.hpp +++ b/include/boost/container/vector.hpp @@ -352,7 +352,7 @@ struct vector_alloc_holder size_type next_capacity(size_type additional_objects) const { return next_capacity_calculator - :: + :: get( allocator_traits_type::max_size(this->alloc()) , this->m_capacity, additional_objects ); } diff --git a/proj/to-do.txt b/proj/to-do.txt index 01d497a..a101c69 100644 --- a/proj/to-do.txt +++ b/proj/to-do.txt @@ -60,4 +60,6 @@ Add hash for containers Add std:: hashing support -Fix trivial destructor after move and other optimizing traits \ No newline at end of file +Fix trivial destructor after move and other optimizing traits + +Implement n3586, "Splicing Maps and Sets" (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3586.pdf) diff --git a/proj/vc7ide/bench_flat_multiset.vcproj b/proj/vc7ide/bench_flat_multiset.vcproj new file mode 100644 index 0000000..589774a --- /dev/null +++ b/proj/vc7ide/bench_flat_multiset.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proj/vc7ide/bench_flat_set.vcproj b/proj/vc7ide/bench_flat_set.vcproj new file mode 100644 index 0000000..b898aae --- /dev/null +++ b/proj/vc7ide/bench_flat_set.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proj/vc7ide/bench_set_alloc_v2.vcproj b/proj/vc7ide/bench_set_alloc_v2.vcproj new file mode 100644 index 0000000..a884e94 --- /dev/null +++ b/proj/vc7ide/bench_set_alloc_v2.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proj/vc7ide/bench_set_avl.vcproj b/proj/vc7ide/bench_set_avl.vcproj new file mode 100644 index 0000000..8f74720 --- /dev/null +++ b/proj/vc7ide/bench_set_avl.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proj/vc7ide/bench_set_multi.vcproj b/proj/vc7ide/bench_set_multi.vcproj new file mode 100644 index 0000000..b400b7d --- /dev/null +++ b/proj/vc7ide/bench_set_multi.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proj/vc7ide/bench_set_sg.vcproj b/proj/vc7ide/bench_set_sg.vcproj new file mode 100644 index 0000000..e6560e9 --- /dev/null +++ b/proj/vc7ide/bench_set_sg.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proj/vc7ide/bench_set_sp.vcproj b/proj/vc7ide/bench_set_sp.vcproj new file mode 100644 index 0000000..4e92a22 --- /dev/null +++ b/proj/vc7ide/bench_set_sp.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proj/vc7ide/container.sln b/proj/vc7ide/container.sln index feff780..b7d1d07 100644 --- a/proj/vc7ide/container.sln +++ b/proj/vc7ide/container.sln @@ -139,6 +139,34 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_extended_allocators", " ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_set_avl", "bench_set_avl.vcproj", "{5E1C1C23-26A9-AC4E-1FE5-C733DA52712B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_set_multi", "bench_set_multi.vcproj", "{51E1C2C3-26A9-24FE-24DE-DB271C32332B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_set_sg", "bench_set_sg.vcproj", "{51C2C0E3-6A93-4F4E-4DE1-D25273C32B3B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_set_sp", "bench_set_sp.vcproj", "{5C2C01E3-4E4F-6A93-4DE1-D5273C316BBB}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_flat_set", "bench_flat_set.vcproj", "{5C2C01E3-DE40-F4A9-63F3-D3C316B327AB}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_flat_multiset", "bench_flat_multiset.vcproj", "{E5C01323-3F2C-D074-F4A9-D16B31CC275B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_set_alloc_v2", "bench_set_alloc_v2.vcproj", "{5C2D1813-24CE-A826-4FE5-5732251A3FAF}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -287,6 +315,34 @@ Global {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Debug.Build.0 = Debug|Win32 {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Release.ActiveCfg = Release|Win32 {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Release.Build.0 = Release|Win32 + {5E1C1C23-26A9-AC4E-1FE5-C733DA52712B}.Debug.ActiveCfg = Debug|Win32 + {5E1C1C23-26A9-AC4E-1FE5-C733DA52712B}.Debug.Build.0 = Debug|Win32 + {5E1C1C23-26A9-AC4E-1FE5-C733DA52712B}.Release.ActiveCfg = Release|Win32 + {5E1C1C23-26A9-AC4E-1FE5-C733DA52712B}.Release.Build.0 = Release|Win32 + {51E1C2C3-26A9-24FE-24DE-DB271C32332B}.Debug.ActiveCfg = Debug|Win32 + {51E1C2C3-26A9-24FE-24DE-DB271C32332B}.Debug.Build.0 = Debug|Win32 + {51E1C2C3-26A9-24FE-24DE-DB271C32332B}.Release.ActiveCfg = Release|Win32 + {51E1C2C3-26A9-24FE-24DE-DB271C32332B}.Release.Build.0 = Release|Win32 + {51C2C0E3-6A93-4F4E-4DE1-D25273C32B3B}.Debug.ActiveCfg = Debug|Win32 + {51C2C0E3-6A93-4F4E-4DE1-D25273C32B3B}.Debug.Build.0 = Debug|Win32 + {51C2C0E3-6A93-4F4E-4DE1-D25273C32B3B}.Release.ActiveCfg = Release|Win32 + {51C2C0E3-6A93-4F4E-4DE1-D25273C32B3B}.Release.Build.0 = Release|Win32 + {5C2C01E3-4E4F-6A93-4DE1-D5273C316BBB}.Debug.ActiveCfg = Debug|Win32 + {5C2C01E3-4E4F-6A93-4DE1-D5273C316BBB}.Debug.Build.0 = Debug|Win32 + {5C2C01E3-4E4F-6A93-4DE1-D5273C316BBB}.Release.ActiveCfg = Release|Win32 + {5C2C01E3-4E4F-6A93-4DE1-D5273C316BBB}.Release.Build.0 = Release|Win32 + {5C2C01E3-DE40-F4A9-63F3-D3C316B327AB}.Debug.ActiveCfg = Debug|Win32 + {5C2C01E3-DE40-F4A9-63F3-D3C316B327AB}.Debug.Build.0 = Debug|Win32 + {5C2C01E3-DE40-F4A9-63F3-D3C316B327AB}.Release.ActiveCfg = Release|Win32 + {5C2C01E3-DE40-F4A9-63F3-D3C316B327AB}.Release.Build.0 = Release|Win32 + {E5C01323-3F2C-D074-F4A9-D16B31CC275B}.Debug.ActiveCfg = Debug|Win32 + {E5C01323-3F2C-D074-F4A9-D16B31CC275B}.Debug.Build.0 = Debug|Win32 + {E5C01323-3F2C-D074-F4A9-D16B31CC275B}.Release.ActiveCfg = Release|Win32 + {E5C01323-3F2C-D074-F4A9-D16B31CC275B}.Release.Build.0 = Release|Win32 + {5C2D1813-24CE-A826-4FE5-5732251A3FAF}.Debug.ActiveCfg = Debug|Win32 + {5C2D1813-24CE-A826-4FE5-5732251A3FAF}.Debug.Build.0 = Debug|Win32 + {5C2D1813-24CE-A826-4FE5-5732251A3FAF}.Release.ActiveCfg = Release|Win32 + {5C2D1813-24CE-A826-4FE5-5732251A3FAF}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection diff --git a/test/print_container.hpp b/test/print_container.hpp index 1f7637d..4a09cdc 100644 --- a/test/print_container.hpp +++ b/test/print_container.hpp @@ -20,8 +20,11 @@ namespace boost{ namespace container { namespace test{ -struct PrintValues : public std::unary_function +struct PrintValues { + typedef int argument_type; + typedef void result_type; + void operator() (int value) const { std::cout << value << " ";