Skip to content

Commit c451e3f

Browse files
committed
Add segmente input and output testing to more algorithms
1 parent e85fe7a commit c451e3f

1 file changed

Lines changed: 84 additions & 61 deletions

File tree

experimental/bench_segmented_algos.cpp

Lines changed: 84 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,65 +1408,65 @@ struct seg_search_n {
14081408
};
14091409

14101410
// --- set_union ---
1411-
template<class C, class OutVec>
1411+
template<class C1, class C2, class OutT>
14121412
struct std_set_union {
1413-
const C &c; const C &c2; OutVec &out;
1414-
std_set_union(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1413+
const C1 &c; const C2 &c2; OutT &out;
1414+
std_set_union(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14151415
BOOST_CONTAINER_FORCEINLINE void operator()()
14161416
{ clobber(); std::set_union(c.begin(), c.end(), c2.begin(), c2.end(), out.begin()); escape(&out[0]); }
14171417
};
1418-
template<class C, class OutVec, bool Wrap = false>
1418+
template<class C1, class C2, class OutT, bool Wrap = false>
14191419
struct seg_set_union {
1420-
const C &c; const C &c2; OutVec &out;
1421-
seg_set_union(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1420+
const C1 &c; const C2 &c2; OutT &out;
1421+
seg_set_union(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14221422
BOOST_CONTAINER_FORCEINLINE void operator()()
14231423
{ clobber(); bc::segmented_set_union(iter_w<Wrap>::wrap(c.begin()), iter_w<Wrap>::wrap(c.end()), iter_w<Wrap>::wrap(c2.begin()), iter_w<Wrap>::wrap(c2.end()), iter_w<Wrap>::wrap(out.begin())); escape(&out[0]); }
14241424
};
14251425

14261426
// --- set_difference ---
1427-
template<class C, class OutVec>
1427+
template<class C1, class C2, class OutT>
14281428
struct std_set_difference {
1429-
const C &c; const C &c2; OutVec &out;
1430-
std_set_difference(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1429+
const C1 &c; const C2 &c2; OutT &out;
1430+
std_set_difference(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14311431
BOOST_CONTAINER_FORCEINLINE void operator()()
14321432
{ clobber(); std::set_difference(c.begin(), c.end(), c2.begin(), c2.end(), out.begin()); escape(&out[0]); }
14331433
};
1434-
template<class C, class OutVec, bool Wrap = false>
1434+
template<class C1, class C2, class OutT, bool Wrap = false>
14351435
struct seg_set_difference {
1436-
const C &c; const C &c2; OutVec &out;
1437-
seg_set_difference(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1436+
const C1 &c; const C2 &c2; OutT &out;
1437+
seg_set_difference(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14381438
BOOST_CONTAINER_FORCEINLINE void operator()()
14391439
{ clobber(); bc::segmented_set_difference(iter_w<Wrap>::wrap(c.begin()), iter_w<Wrap>::wrap(c.end()), iter_w<Wrap>::wrap(c2.begin()), iter_w<Wrap>::wrap(c2.end()), iter_w<Wrap>::wrap(out.begin())); escape(&out[0]); }
14401440
};
14411441

14421442
// --- set_intersection ---
1443-
template<class C, class OutVec>
1443+
template<class C1, class C2, class OutT>
14441444
struct std_set_intersection {
1445-
const C &c; const C &c2; OutVec &out;
1446-
std_set_intersection(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1445+
const C1 &c; const C2 &c2; OutT &out;
1446+
std_set_intersection(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14471447
BOOST_CONTAINER_FORCEINLINE void operator()()
14481448
{ clobber(); std::set_intersection(c.begin(), c.end(), c2.begin(), c2.end(), out.begin()); escape(&out[0]); }
14491449
};
1450-
template<class C, class OutVec, bool Wrap = false>
1450+
template<class C1, class C2, class OutT, bool Wrap = false>
14511451
struct seg_set_intersection {
1452-
const C &c; const C &c2; OutVec &out;
1453-
seg_set_intersection(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1452+
const C1 &c; const C2 &c2; OutT &out;
1453+
seg_set_intersection(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14541454
BOOST_CONTAINER_FORCEINLINE void operator()()
14551455
{ clobber(); bc::segmented_set_intersection(iter_w<Wrap>::wrap(c.begin()), iter_w<Wrap>::wrap(c.end()), iter_w<Wrap>::wrap(c2.begin()), iter_w<Wrap>::wrap(c2.end()), iter_w<Wrap>::wrap(out.begin())); escape(&out[0]); }
14561456
};
14571457

14581458
// --- set_symmetric_difference ---
1459-
template<class C, class OutVec>
1459+
template<class C1, class C2, class OutT>
14601460
struct std_set_symmetric_difference {
1461-
const C &c; const C &c2; OutVec &out;
1462-
std_set_symmetric_difference(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1461+
const C1 &c; const C2 &c2; OutT &out;
1462+
std_set_symmetric_difference(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14631463
BOOST_CONTAINER_FORCEINLINE void operator()()
14641464
{ clobber(); std::set_symmetric_difference(c.begin(), c.end(), c2.begin(), c2.end(), out.begin()); escape(&out[0]); }
14651465
};
1466-
template<class C, class OutVec, bool Wrap = false>
1466+
template<class C1, class C2, class OutT, bool Wrap = false>
14671467
struct seg_set_symmetric_difference {
1468-
const C &c; const C &c2; OutVec &out;
1469-
seg_set_symmetric_difference(const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1468+
const C1 &c; const C2 &c2; OutT &out;
1469+
seg_set_symmetric_difference(const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14701470
BOOST_CONTAINER_FORCEINLINE void operator()()
14711471
{ clobber(); bc::segmented_set_symmetric_difference(iter_w<Wrap>::wrap(c.begin()), iter_w<Wrap>::wrap(c.end()), iter_w<Wrap>::wrap(c2.begin()), iter_w<Wrap>::wrap(c2.end()), iter_w<Wrap>::wrap(out.begin())); escape(&out[0]); }
14721472
};
@@ -2041,52 +2041,48 @@ void bench_search_n(const C &c, std::size_t iters, const char* cname,
20412041
bench_ops::seg_search_n<C, true>(c, count, val, result), label, cname);
20422042
}
20432043

2044-
template<class C>
2045-
void bench_set_union(const C &c, const C &c2, std::size_t iters, const char* cname)
2044+
template<class C1, class C2, class OutT>
2045+
void bench_set_union(const C1 &c, const C2 &c2, std::size_t iters,
2046+
const char* cname, const char* label)
20462047
{
2047-
typedef typename C::value_type VT;
2048-
typedef boost::container::vector<VT> out_vec_t;
2049-
out_vec_t out(c.size() + c2.size());
2048+
OutT out(c.size() + c2.size());
20502049
compare_batch(iters, c.size(),
2051-
bench_ops::std_set_union<C, out_vec_t>(c, c2, out),
2052-
bench_ops::seg_set_union<C, out_vec_t>(c, c2, out),
2053-
bench_ops::seg_set_union<C, out_vec_t, true>(c, c2, out), "set_union", cname);
2050+
bench_ops::std_set_union<C1, C2, OutT>(c, c2, out),
2051+
bench_ops::seg_set_union<C1, C2, OutT>(c, c2, out),
2052+
bench_ops::seg_set_union<C1, C2, OutT, true>(c, c2, out), label, cname);
20542053
}
20552054

2056-
template<class C>
2057-
void bench_set_difference(const C &c, const C &c2, std::size_t iters, const char* cname)
2055+
template<class C1, class C2, class OutT>
2056+
void bench_set_difference(const C1 &c, const C2 &c2, std::size_t iters,
2057+
const char* cname, const char* label)
20582058
{
2059-
typedef typename C::value_type VT;
2060-
typedef boost::container::vector<VT> out_vec_t;
2061-
out_vec_t out(c.size());
2059+
OutT out(c.size());
20622060
compare_batch(iters, c.size(),
2063-
bench_ops::std_set_difference<C, out_vec_t>(c, c2, out),
2064-
bench_ops::seg_set_difference<C, out_vec_t>(c, c2, out),
2065-
bench_ops::seg_set_difference<C, out_vec_t, true>(c, c2, out), "set_difference", cname);
2061+
bench_ops::std_set_difference<C1, C2, OutT>(c, c2, out),
2062+
bench_ops::seg_set_difference<C1, C2, OutT>(c, c2, out),
2063+
bench_ops::seg_set_difference<C1, C2, OutT, true>(c, c2, out), label, cname);
20662064
}
20672065

2068-
template<class C>
2069-
void bench_set_intersection(const C &c, const C &c2, std::size_t iters, const char* cname)
2066+
template<class C1, class C2, class OutT>
2067+
void bench_set_intersection(const C1 &c, const C2 &c2, std::size_t iters,
2068+
const char* cname, const char* label)
20702069
{
2071-
typedef typename C::value_type VT;
2072-
typedef boost::container::vector<VT> out_vec_t;
2073-
out_vec_t out(c.size());
2070+
OutT out(c.size());
20742071
compare_batch(iters, c.size(),
2075-
bench_ops::std_set_intersection<C, out_vec_t>(c, c2, out),
2076-
bench_ops::seg_set_intersection<C, out_vec_t>(c, c2, out),
2077-
bench_ops::seg_set_intersection<C, out_vec_t, true>(c, c2, out), "set_intersection", cname);
2072+
bench_ops::std_set_intersection<C1, C2, OutT>(c, c2, out),
2073+
bench_ops::seg_set_intersection<C1, C2, OutT>(c, c2, out),
2074+
bench_ops::seg_set_intersection<C1, C2, OutT, true>(c, c2, out), label, cname);
20782075
}
20792076

2080-
template<class C>
2081-
void bench_set_symmetric_difference(const C &c, const C &c2, std::size_t iters, const char* cname)
2077+
template<class C1, class C2, class OutT>
2078+
void bench_set_symmetric_difference(const C1 &c, const C2 &c2, std::size_t iters,
2079+
const char* cname, const char* label)
20822080
{
2083-
typedef typename C::value_type VT;
2084-
typedef boost::container::vector<VT> out_vec_t;
2085-
out_vec_t out(c.size() + c2.size());
2081+
OutT out(c.size() + c2.size());
20862082
compare_batch(iters, c.size(),
2087-
bench_ops::std_set_symmetric_difference<C, out_vec_t>(c, c2, out),
2088-
bench_ops::seg_set_symmetric_difference<C, out_vec_t>(c, c2, out),
2089-
bench_ops::seg_set_symmetric_difference<C, out_vec_t, true>(c, c2, out), "set_symmetric_difference", cname);
2083+
bench_ops::std_set_symmetric_difference<C1, C2, OutT>(c, c2, out),
2084+
bench_ops::seg_set_symmetric_difference<C1, C2, OutT>(c, c2, out),
2085+
bench_ops::seg_set_symmetric_difference<C1, C2, OutT, true>(c, c2, out), label, cname);
20902086
}
20912087

20922088
template<class C, class Pred>
@@ -2289,6 +2285,8 @@ void run_all(const C& c, std::size_t iters, const char* cname)
22892285
bench_merge<C, vec_t, vec_t>(c, c2v, iters, cname, "merge(1S)");
22902286
// merge(2S): first range = bc::vector, second range = C, out = bc::vector
22912287
bench_merge<vec_t, C, vec_t>(cv, c2, iters, cname, "merge(2S)");
2288+
// merge(3S): first range = bc::vector, second range = bc::vector, out = C
2289+
bench_merge<vec_t, vec_t, C >(cv, c2v, iters, cname, "merge(3S)");
22922290
// merge(2xS): both ranges = C, out = bc::vector
22932291
bench_merge<C, C, vec_t>(c, c2, iters, cname, "merge(2xS)");
22942292
// merge(3xS): both ranges and out = C
@@ -2403,15 +2401,40 @@ void run_all(const C& c, std::size_t iters, const char* cname)
24032401
bench_search_n(c, iters, cname, 1, half, "search_n(hit)");
24042402
bench_search_n(c, iters, cname, 3, min1, "search_n(miss)");
24052403

2406-
//set_difference, set_symmetric_difference, set_union
2404+
//set_difference, set_intersection, set_symmetric_difference, set_union
24072405
{
24082406
C c2(c);
24092407
for (typename C::iterator it = c2.begin(); it != c2.end(); ++it)
24102408
*it = VT(int_value(*it) * 2);
2411-
bench_set_difference(c, c2, iters, cname);
2412-
bench_set_intersection(c, c2, iters, cname);
2413-
bench_set_symmetric_difference(c, c2, iters, cname);
2414-
bench_set_union(c, c2, iters, cname);
2409+
vec_t c2v(c2.begin(), c2.end());
2410+
2411+
// set_difference
2412+
bench_set_difference<C, vec_t, vec_t>(c, c2v, iters, cname, "set_difference(1S)");
2413+
bench_set_difference<vec_t, C, vec_t>(cv, c2, iters, cname, "set_difference(2S)");
2414+
bench_set_difference<vec_t, vec_t, C >(cv, c2v, iters, cname, "set_difference(3S)");
2415+
bench_set_difference<C, C, vec_t>(c, c2, iters, cname, "set_difference(2xS)");
2416+
bench_set_difference<C, C, C >(c, c2, iters, cname, "set_difference(3xS)");
2417+
2418+
// set_intersection
2419+
bench_set_intersection<C, vec_t, vec_t>(c, c2v, iters, cname, "set_intersection(1S)");
2420+
bench_set_intersection<vec_t, C, vec_t>(cv, c2, iters, cname, "set_intersection(2S)");
2421+
bench_set_intersection<vec_t, vec_t, C >(cv, c2v, iters, cname, "set_intersection(3S)");
2422+
bench_set_intersection<C, C, vec_t>(c, c2, iters, cname, "set_intersection(2xS)");
2423+
bench_set_intersection<C, C, C >(c, c2, iters, cname, "set_intersection(3xS)");
2424+
2425+
// set_symmetric_difference
2426+
bench_set_symmetric_difference<C, vec_t, vec_t>(c, c2v, iters, cname, "set_sym_diff(1S)");
2427+
bench_set_symmetric_difference<vec_t, C, vec_t>(cv, c2, iters, cname, "set_sym_diff(2S)");
2428+
bench_set_symmetric_difference<vec_t, vec_t, C >(cv, c2v, iters, cname, "set_sym_diff(3S)");
2429+
bench_set_symmetric_difference<C, C, vec_t>(c, c2, iters, cname, "set_sym_diff(2xS)");
2430+
bench_set_symmetric_difference<C, C, C >(c, c2, iters, cname, "set_sym_diff(3xS)");
2431+
2432+
// set_union
2433+
bench_set_union<C, vec_t, vec_t>(c, c2v, iters, cname, "set_union(1S)");
2434+
bench_set_union<vec_t, C, vec_t>(cv, c2, iters, cname, "set_union(2S)");
2435+
bench_set_union<vec_t, vec_t, C >(cv, c2v, iters, cname, "set_union(3S)");
2436+
bench_set_union<C, C, vec_t>(c, c2, iters, cname, "set_union(2xS)");
2437+
bench_set_union<C, C, C >(c, c2, iters, cname, "set_union(3xS)");
24152438
}
24162439

24172440
//stable_partition (not tested since it's not optimized for random access iterators)

0 commit comments

Comments
 (0)