Skip to content

Commit f0b9c5c

Browse files
committed
Add explicit bench for newly refactored dual segmented algorithms.
1 parent 562af5a commit f0b9c5c

1 file changed

Lines changed: 62 additions & 47 deletions

File tree

experimental/bench_segmented_algos.cpp

Lines changed: 62 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,12 +1037,13 @@ void bench_copy(const C &c, std::size_t iters, const char* cname, const char* la
10371037
print_ratio(label, cname, r1, r2);
10381038
}
10391039

1040-
template<class C, class Pred>
1040+
template<bool DequeOut, class C, class Pred>
10411041
void bench_copy_if(const C &c, std::size_t iters, const char* cname,
10421042
Pred pred, const char* label)
10431043
{
10441044
typedef typename C::value_type VT;
1045-
boost::container::vector<VT> out(c.size());
1045+
typedef typename boost::move_detail::if_c<DequeOut, bc::deque<VT>, boost::container::vector<VT> >::type out_t;
1046+
out_t out(c.size());
10461047

10471048
cpu_timer t1;
10481049
{ std::size_t n_ = (iters + 7) / 8;
@@ -1795,39 +1796,42 @@ void bench_find_last_if_not(const C &c, std::size_t iters, const char* cname,
17951796
print_ratio(label, cname, r1, r2);
17961797
}
17971798

1798-
template<class C>
1799+
template<bool DequeSecond, class C>
17991800
void bench_equal(const C &c, const C &c2, std::size_t iters, const char* cname,
18001801
const char* label)
18011802
{
1803+
typedef typename C::value_type VT;
1804+
typedef typename boost::move_detail::if_c<DequeSecond, bc::deque<VT>, boost::container::vector<VT> >::type range2_t;
1805+
range2_t range2(c2.begin(), c2.end());
18021806
int result = 0;
18031807

18041808
cpu_timer t1;
18051809
{ std::size_t n_ = (iters + 7) / 8;
18061810
t1.resume();
18071811
switch (iters % 8) {
18081812
case 0: do {
1809-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1813+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18101814
BOOST_FALLTHROUGH;
18111815
case 7:
1812-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1816+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18131817
BOOST_FALLTHROUGH;
18141818
case 6:
1815-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1819+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18161820
BOOST_FALLTHROUGH;
18171821
case 5:
1818-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1822+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18191823
BOOST_FALLTHROUGH;
18201824
case 4:
1821-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1825+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18221826
BOOST_FALLTHROUGH;
18231827
case 3:
1824-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1828+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18251829
BOOST_FALLTHROUGH;
18261830
case 2:
1827-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1831+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18281832
BOOST_FALLTHROUGH;
18291833
case 1:
1830-
{ clobber(); result = std::equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1834+
{ clobber(); result = std::equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18311835
if (BOOST_UNLIKELY(--n_ == 0)) { t1.stop(); break; }
18321836
} while (true);
18331837
}
@@ -1838,28 +1842,28 @@ void bench_equal(const C &c, const C &c2, std::size_t iters, const char* cname,
18381842
t2.resume();
18391843
switch (iters % 8) {
18401844
case 0: do {
1841-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1845+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18421846
BOOST_FALLTHROUGH;
18431847
case 7:
1844-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1848+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18451849
BOOST_FALLTHROUGH;
18461850
case 6:
1847-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1851+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18481852
BOOST_FALLTHROUGH;
18491853
case 5:
1850-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1854+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18511855
BOOST_FALLTHROUGH;
18521856
case 4:
1853-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1857+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18541858
BOOST_FALLTHROUGH;
18551859
case 3:
1856-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1860+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18571861
BOOST_FALLTHROUGH;
18581862
case 2:
1859-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1863+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18601864
BOOST_FALLTHROUGH;
18611865
case 1:
1862-
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), c2.begin()) ? 1 : 0; escape(&result); }
1866+
{ clobber(); result = bc::segmented_equal(c.begin(), c.end(), range2.begin()) ? 1 : 0; escape(&result); }
18631867
if (BOOST_UNLIKELY(--n_ == 0)) { t2.stop(); break; }
18641868
} while (true);
18651869
}
@@ -2192,11 +2196,12 @@ void bench_fill_n(const C &c, std::size_t iters, const char* cname)
21922196
print_ratio("fill_n", cname, r1, r2);
21932197
}
21942198

2195-
template<class C>
2196-
void bench_copy_n(const C &c, std::size_t iters, const char* cname)
2199+
template<bool DequeOut, class C>
2200+
void bench_copy_n(const C &c, std::size_t iters, const char* cname, const char* label)
21972201
{
21982202
typedef typename C::value_type VT;
2199-
boost::container::vector<VT> out(c.size());
2203+
typedef typename boost::move_detail::if_c<DequeOut, bc::deque<VT>, boost::container::vector<VT> >::type out_t;
2204+
out_t out(c.size());
22002205
typename C::difference_type n =
22012206
static_cast<typename C::difference_type>(c.size());
22022207

@@ -2266,7 +2271,7 @@ void bench_copy_n(const C &c, std::size_t iters, const char* cname)
22662271

22672272
double r1 = calc_ns_per_elem(t1.elapsed().wall, iters, c.size());
22682273
double r2 = calc_ns_per_elem(t2.elapsed().wall, iters, c.size());
2269-
print_ratio("copy_n", cname, r1, r2);
2274+
print_ratio(label, cname, r1, r2);
22702275
}
22712276

22722277
template<class C>
@@ -3200,39 +3205,42 @@ void bench_merge(const C &c, const C &c2, std::size_t iters, const char* cname)
32003205
print_ratio("merge", cname, r1, r2);
32013206
}
32023207

3203-
template<class C>
3208+
template<bool DequeSecond, class C>
32043209
void bench_mismatch(const C &c, const C &c2, std::size_t iters, const char* cname,
32053210
const char* label)
32063211
{
3212+
typedef typename C::value_type VT;
3213+
typedef typename boost::move_detail::if_c<DequeSecond, bc::deque<VT>, boost::container::vector<VT> >::type range2_t;
3214+
range2_t range2(c2.begin(), c2.end());
32073215
int result = 0;
32083216

32093217
cpu_timer t1;
32103218
{ std::size_t n_ = (iters + 7) / 8;
32113219
t1.resume();
32123220
switch (iters % 8) {
32133221
case 0: do {
3214-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3222+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32153223
BOOST_FALLTHROUGH;
32163224
case 7:
3217-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3225+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32183226
BOOST_FALLTHROUGH;
32193227
case 6:
3220-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3228+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32213229
BOOST_FALLTHROUGH;
32223230
case 5:
3223-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3231+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32243232
BOOST_FALLTHROUGH;
32253233
case 4:
3226-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3234+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32273235
BOOST_FALLTHROUGH;
32283236
case 3:
3229-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3237+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32303238
BOOST_FALLTHROUGH;
32313239
case 2:
3232-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3240+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32333241
BOOST_FALLTHROUGH;
32343242
case 1:
3235-
{ clobber(); result = (std::mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3243+
{ clobber(); result = (std::mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32363244
if (BOOST_UNLIKELY(--n_ == 0)) { t1.stop(); break; }
32373245
} while (true);
32383246
}
@@ -3243,28 +3251,28 @@ void bench_mismatch(const C &c, const C &c2, std::size_t iters, const char* cnam
32433251
t2.resume();
32443252
switch (iters % 8) {
32453253
case 0: do {
3246-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3254+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32473255
BOOST_FALLTHROUGH;
32483256
case 7:
3249-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3257+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32503258
BOOST_FALLTHROUGH;
32513259
case 6:
3252-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3260+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32533261
BOOST_FALLTHROUGH;
32543262
case 5:
3255-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3263+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32563264
BOOST_FALLTHROUGH;
32573265
case 4:
3258-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3266+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32593267
BOOST_FALLTHROUGH;
32603268
case 3:
3261-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3269+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32623270
BOOST_FALLTHROUGH;
32633271
case 2:
3264-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3272+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32653273
BOOST_FALLTHROUGH;
32663274
case 1:
3267-
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), c2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
3275+
{ clobber(); result = (bc::segmented_mismatch(c.begin(), c.end(), range2.begin()).first == c.end()) ? 1 : 0; escape(&result); }
32683276
if (BOOST_UNLIKELY(--n_ == 0)) { t2.stop(); break; }
32693277
} while (true);
32703278
}
@@ -4164,11 +4172,14 @@ void run_all(const C& c, std::size_t iters, const char* cname)
41644172
bench_copy<true>(c, iters, cname, "copy(2xS)");
41654173

41664174
//copy_if
4167-
bench_copy_if(c, iters, cname, is_odd<VT>(), "copy_if(hit)");
4168-
bench_copy_if(c, iters, cname, is_negative<VT>(), "copy_if(miss)");
4175+
bench_copy_if<false>(c, iters, cname, is_odd<VT>(), "copy_if(hit)");
4176+
bench_copy_if<true>(c, iters, cname, is_odd<VT>(), "copy_if(2xS hit)");
4177+
bench_copy_if<false>(c, iters, cname, is_negative<VT>(), "copy_if(miss)");
4178+
bench_copy_if<true>(c, iters, cname, is_negative<VT>(), "copy_if(2xS miss)");
41694179

41704180
//copy_n
4171-
bench_copy_n(c, iters, cname);
4181+
bench_copy_n<false>(c, iters, cname, "copy_n");
4182+
bench_copy_n<true>(c, iters, cname, "copy_n(2xS)");
41724183

41734184
//count
41744185
bench_count(c, iters, cname, zero, "count(hit)");
@@ -4181,9 +4192,11 @@ void run_all(const C& c, std::size_t iters, const char* cname)
41814192
//equal
41824193
{
41834194
C c2(c);
4184-
bench_equal(c, c2, iters, cname, "equal(hit)");
4195+
bench_equal<false>(c, c2, iters, cname, "equal(hit)");
4196+
bench_equal<true>(c, c2, iters, cname, "equal(2xS hit)");
41854197
*boost::container::make_iterator_uadvance(c2.begin(), c2.size()/2) = min1;
4186-
bench_equal(c, c2, iters, cname, "equal(miss)");
4198+
bench_equal<false>(c, c2, iters, cname, "equal(miss)");
4199+
bench_equal<true>(c, c2, iters, cname, "equal(2xS miss)");
41874200
}
41884201

41894202
//fill
@@ -4261,10 +4274,12 @@ void run_all(const C& c, std::size_t iters, const char* cname)
42614274
{
42624275
C c2(c);
42634276
*boost::container::make_iterator_uadvance(c2.begin(), c2.size()/2) = min1;
4264-
bench_mismatch(c, c2, iters, cname, "mismatch(hit)");
4277+
bench_mismatch<false>(c, c2, iters, cname, "mismatch(hit)");
4278+
bench_mismatch<true>(c, c2, iters, cname, "mismatch(2xS hit)");
42654279
*boost::container::make_iterator_uadvance(c2.begin(), c2.size()/2) =
42664280
*boost::container::make_iterator_uadvance(c.begin(), c.size()/2);
4267-
bench_mismatch(c, c2, iters, cname, "mismatch(miss)");
4281+
bench_mismatch<false>(c, c2, iters, cname, "mismatch(miss)");
4282+
bench_mismatch<true>(c, c2, iters, cname, "mismatch(2xS miss)");
42684283
}
42694284

42704285
//none_of

0 commit comments

Comments
 (0)