diff --git a/experimental/bench_segmented_algos.cpp b/experimental/bench_segmented_algos.cpp index d682b39..910d578 100644 --- a/experimental/bench_segmented_algos.cpp +++ b/experimental/bench_segmented_algos.cpp @@ -86,7 +86,6 @@ #include "../bench/bench_utils.hpp" #define BOOST_CONTAINER_BENCH_SEGMENTED_GROUP 0 -#define BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED 0 namespace bc = boost::container; @@ -648,6 +647,11 @@ inline void print_subheader() << '\n'; } +inline void print_group_header(int group, const char* desc) +{ + std::cout << "\n===== Group " << group << ": " << desc << " =====\n"; +} + struct geomean_accumulator { double std_over_seg_log_sum, std_over_nsg_log_sum, ns_over_std_over_seg_log_sum; @@ -2147,9 +2151,10 @@ void run_all(const C& c, std::size_t iters, const char* cname) print_subheader(); ////////////////////////////////////////////////////////////////// - // Group 1: Algorithms with a single range + // Group 10: single range, sequential access ////////////////////////////////////////////////////////////////// #if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 10 + print_group_header(10, "single range, sequential access"); //all_of bench_all_of(c, iters, cname, is_zero_or_positive(), "all_of(hit)"); @@ -2185,20 +2190,6 @@ void run_all(const C& c, std::size_t iters, const char* cname) bench_find_if_not(c, iters, cname, unequal_to_ref(half), "find_if_not(hit)"); bench_find_if_not(c, iters, cname, is_zero_or_positive(), "find_if_not(miss)"); -#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED) || BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED - //find_last - bench_find_last(c, iters, cname, half, "find_last(hit)"); - bench_find_last(c, iters, cname, min1, "find_last(miss)"); - - //find_last_if - bench_find_last_if(c, iters, cname, equal_to_ref(half), "find_last_if(hit)"); - bench_find_last_if(c, iters, cname, is_negative(), "find_last_if(miss)"); - - //find_last_if_not - bench_find_last_if_not(c, iters, cname, unequal_to_ref(half), "find_last_if_not(hit)"); - bench_find_last_if_not(c, iters, cname, is_zero_or_positive(), "find_last_if_not(miss)"); -#endif - //for_each bench_for_each(c, iters, cname); @@ -2220,12 +2211,6 @@ void run_all(const C& c, std::size_t iters, const char* cname) bench_none_of(c, iters, cname, is_negative(), "none_of(hit)"); bench_none_of(c, iters, cname, equal_to_ref(VT(static_cast(c.size()/2))), "none_of(miss)"); - #if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED) || BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED - //partition - bench_partition(c, iters, cname, is_odd(), "partition(hit)"); - bench_partition(c, iters, cname, is_negative(), "partition(miss)"); - #endif - //replace { C c2(c); @@ -2249,9 +2234,10 @@ void run_all(const C& c, std::size_t iters, const char* cname) #endif ////////////////////////////////////////////////////////////////// - // Group 1.5: Algorithms with 1 range but two iterational directions + // Group 15: single range, non-sequential access pattern ////////////////////////////////////////////////////////////////// #if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 15 + print_group_header(15, "single range, non-sequential access pattern"); //is_sorted { @@ -2282,11 +2268,6 @@ void run_all(const C& c, std::size_t iters, const char* cname) bench_remove_if(c, iters, cname, less_and_greater_ref(quart, threequart), "remove_if(hit)"); bench_remove_if(c, iters, cname, is_negative(), "remove_if(miss)"); -#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED) || BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED - //reverse - bench_reverse(c, iters, cname); -#endif - //search_n bench_search_n(c, iters, cname, 1, half, "search_n(1hit)"); bench_search_n(c, iters, cname, 3, min1, "search_n(miss)"); @@ -2321,13 +2302,37 @@ void run_all(const C& c, std::size_t iters, const char* cname) #endif ////////////////////////////////////////////////////////////////// - // Group 2: Algorithms with 2 ranges + // Group 17: single range, bidirectional iterator optimizations ////////////////////////////////////////////////////////////////// -#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 20 +#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 17 + print_group_header(17, "single range, bidirectional iterator optimizations"); + + //find_last + bench_find_last(c, iters, cname, half, "find_last(hit)"); + bench_find_last(c, iters, cname, min1, "find_last(miss)"); + + //find_last_if + bench_find_last_if(c, iters, cname, equal_to_ref(half), "find_last_if(hit)"); + bench_find_last_if(c, iters, cname, is_negative(), "find_last_if(miss)"); + + //find_last_if_not + bench_find_last_if_not(c, iters, cname, unequal_to_ref(half), "find_last_if_not(hit)"); + bench_find_last_if_not(c, iters, cname, is_zero_or_positive(), "find_last_if_not(miss)"); + + //partition + bench_partition(c, iters, cname, is_odd(), "partition(hit)"); + bench_partition(c, iters, cname, is_negative(), "partition(miss)"); + + //reverse + bench_reverse(c, iters, cname); + +#endif ////////////////////////////////////////////////////////////////// - // Group 2a: input-only algorithms (all ranges are read-only inputs) + // Group 20: 2-range input-only algorithms (all ranges read-only) ////////////////////////////////////////////////////////////////// +#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 20 + print_group_header(20, "2-range input-only algorithms"); //equal { @@ -2385,9 +2390,13 @@ void run_all(const C& c, std::size_t iters, const char* cname) bench_search(c, iters, cname, miss_pat, 3, "search(miss)"); } +#endif + ////////////////////////////////////////////////////////////////// - // Group 2b: algorithms writing through an output iterator + // Group 25: 2-range input-output algorithms (write through output iterator) ////////////////////////////////////////////////////////////////// +#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 25 + print_group_header(25, "2-range input-output algorithms"); //copy bench_copy(c, iters, cname, "copy(1S)"); @@ -2423,62 +2432,36 @@ void run_all(const C& c, std::size_t iters, const char* cname) bench_remove_copy_if(cv, iters, cname, is_negative(), "remove_copy_if(2S miss)"); bench_remove_copy_if(c, iters, cname, is_negative(), "remove_copy_if(2xS miss)"); -#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED) || BOOST_CONTAINER_BENCH_SEGMENTED_BIDIR_ENABLED - //reverse_copy - bench_reverse_copy(c, iters, cname, "reverse_copy(1S)"); - bench_reverse_copy(cv, iters, cname, "reverse_copy(2S)"); - bench_reverse_copy(c, iters, cname, "reverse_copy(2xS)"); -#endif + //swap_ranges + bench_swap_ranges(c, iters, cname, "swap_ranges(1S)"); + bench_swap_ranges(cv, iters, cname, "swap_ranges(2S)"); + bench_swap_ranges(c, iters, cname, "swap_ranges(2xS)"); //transform bench_transform(c, iters, cname, "transform(1S)"); bench_transform(cv, iters, cname, "transform(2S)"); bench_transform(c, iters, cname, "transform(2xS)"); - //swap_ranges - bench_swap_ranges(c, iters, cname, "swap_ranges(1S)"); - bench_swap_ranges(cv, iters, cname, "swap_ranges(2S)"); - bench_swap_ranges(c, iters, cname, "swap_ranges(2xS)"); +#endif + + ////////////////////////////////////////////////////////////////// + // Group 27: 2-range algorithms with bidirectional iterator optimizations + ////////////////////////////////////////////////////////////////// +#if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 27 + print_group_header(27, "2-range, bidirectional iterator optimizations"); + + //reverse_copy + bench_reverse_copy(c, iters, cname, "reverse_copy(1S)"); + bench_reverse_copy(cv, iters, cname, "reverse_copy(2S)"); + bench_reverse_copy(c, iters, cname, "reverse_copy(2xS)"); #endif ////////////////////////////////////////////////////////////////// - // Group 3: Algorithms with 3 ranges + // Group 30: 3-range algorithms ////////////////////////////////////////////////////////////////// #if !defined(BOOST_CONTAINER_BENCH_SEGMENTED_GROUP) || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 0 || BOOST_CONTAINER_BENCH_SEGMENTED_GROUP == 30 - - //copy_if - bench_copy_if(c, iters, cname, is_odd(), "copy_if(1S hit)"); - bench_copy_if(cv, iters, cname, is_odd(), "copy_if(2S hit)"); - bench_copy_if(c, iters, cname, is_odd(), "copy_if(2xS hit)"); - bench_copy_if(c, iters, cname, is_negative(), "copy_if(1S miss)"); - bench_copy_if(cv, iters, cname, is_negative(), "copy_if(2S miss)"); - bench_copy_if(c, iters, cname, is_negative(), "copy_if(2xS miss)"); - - //remove_copy - bench_remove_copy(c, iters, cname, half, "remove_copy(1S hit)"); - bench_remove_copy(cv, iters, cname, half, "remove_copy(2S hit)"); - bench_remove_copy(c, iters, cname, half, "remove_copy(2xS hit)"); - bench_remove_copy(c, iters, cname, min1, "remove_copy(1S miss)"); - bench_remove_copy(cv, iters, cname, min1, "remove_copy(2S miss)"); - bench_remove_copy(c, iters, cname, min1, "remove_copy(2xS miss)"); - - //remove_copy_if - bench_remove_copy_if(c, iters, cname, less_and_greater_ref(quart, threequart), "remove_copy_if(1S hit)"); - bench_remove_copy_if(cv, iters, cname, less_and_greater_ref(quart, threequart), "remove_copy_if(2S hit)"); - bench_remove_copy_if(c, iters, cname, less_and_greater_ref(quart, threequart), "remove_copy_if(2xS hit)"); - bench_remove_copy_if(c, iters, cname, is_negative(), "remove_copy_if(1S miss)"); - bench_remove_copy_if(cv, iters, cname, is_negative(), "remove_copy_if(2S miss)"); - bench_remove_copy_if(c, iters, cname, is_negative(), "remove_copy_if(2xS miss)"); - - //partition_copy (range 1 = input, range 2 = out_true, range 3 = out_false) - bench_partition_copy(c, iters, cname, "partition_copy(1S)"); - bench_partition_copy(cv, iters, cname, "partition_copy(2S)"); - bench_partition_copy(cv, iters, cname, "partition_copy(3S)"); - bench_partition_copy(c, iters, cname, "partition_copy(2xS)"); - bench_partition_copy(c, iters, cname, "partition_copy(1+3S)"); - bench_partition_copy(cv, iters, cname, "partition_copy(2+3S)"); - bench_partition_copy(c, iters, cname, "partition_copy(3xS)"); + print_group_header(30, "3-range algorithms"); //merge { @@ -2540,6 +2523,14 @@ void run_all(const C& c, std::size_t iters, const char* cname) bench_set_union(c, c2, iters, cname, "set_union(3xS)"); } + //partition_copy (range 1 = input, range 2 = out_true, range 3 = out_false) + bench_partition_copy(c, iters, cname, "partition_copy(1S)"); + bench_partition_copy(cv, iters, cname, "partition_copy(2S)"); + bench_partition_copy(cv, iters, cname, "partition_copy(3S)"); + bench_partition_copy(c, iters, cname, "partition_copy(2xS)"); + bench_partition_copy(c, iters, cname, "partition_copy(1+3S)"); + bench_partition_copy(cv, iters, cname, "partition_copy(2+3S)"); + bench_partition_copy(c, iters, cname, "partition_copy(3xS)"); #endif std::cout << '\n';