Unroll operation loop to avoid measuring loop overhead and other modifications to exercise more paths of the insertion functions.

This commit is contained in:
Ion Gaztañaga
2020-08-11 23:49:13 +02:00
parent efd08d9a0e
commit 2e78cb524c

View File

@@ -134,7 +134,7 @@ struct insert_near_end_repeated
template<class C> template<class C>
BOOST_CONTAINER_FORCEINLINE void operator()(C &c, int i) BOOST_CONTAINER_FORCEINLINE void operator()(C &c, int i)
{ c.insert(c.size() >= RangeSize ? c.end()-RangeSize : c.begin(), RangeSize, MyInt(i)); } { c.insert(c.size() >= 2*RangeSize ? c.end()-2*RangeSize : c.begin(), RangeSize, MyInt(i)); }
BOOST_CONTAINER_FORCEINLINE const char *name() const BOOST_CONTAINER_FORCEINLINE const char *name() const
{ return "insert_near_end_repeated"; } { return "insert_near_end_repeated"; }
@@ -148,11 +148,11 @@ struct insert_near_end_range
template<class C> template<class C>
BOOST_CONTAINER_FORCEINLINE void operator()(C &c, int) BOOST_CONTAINER_FORCEINLINE void operator()(C &c, int)
{ {
c.insert(c.size() >= RangeSize ? c.end()-RangeSize : c.begin(), &a[0], &a[0]+RangeSize); c.insert(c.size() >= 2*RangeSize ? c.end()-2*RangeSize : c.begin(), &a[0], &a[0]+RangeSize);
} }
BOOST_CONTAINER_FORCEINLINE const char *name() const BOOST_CONTAINER_FORCEINLINE const char *name() const
{ return "insert_near_end_repeated"; } { return "insert_near_end_range"; }
MyInt a[RangeSize]; MyInt a[RangeSize];
}; };
@@ -167,7 +167,7 @@ struct insert_near_end
{ {
typedef typename C::iterator it_t; typedef typename C::iterator it_t;
it_t it (c.end()); it_t it (c.end());
it -= static_cast<typename C::size_type>(!c.empty()); it -= static_cast<typename C::size_type>(c.size() >= 2)*2;
c.insert(it, MyInt(i)); c.insert(it, MyInt(i));
} }
@@ -187,24 +187,41 @@ void vector_test_template(std::size_t num_iterations, std::size_t num_elements,
Operation op; Operation op;
const typename Container::size_type multiplier = op.capacity_multiplier(); const typename Container::size_type multiplier = op.capacity_multiplier();
//Warm-up operations //Warm-up operation
for(std::size_t e = 0, max = num_elements/multiplier; e != max; ++e){ for(std::size_t e = 0, max = num_elements/multiplier; e != max; ++e){
op(c, static_cast<int>(e)); op(c, static_cast<int>(e));
} }
c.clear(); c.clear();
cpu_timer timer; cpu_timer timer;
timer.start();
const std::size_t max = num_elements/multiplier;
for(std::size_t r = 0; r != num_iterations; ++r){ for(std::size_t r = 0; r != num_iterations; ++r){
for(std::size_t e = 0, max = num_elements/multiplier; e != max; ++e){ //Unrolll the loop to avoid noise from loop code
op(c, static_cast<int>(e)); int i = 0;
timer.resume();
for(std::size_t e = 0; e < max/16; ++e){
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
op(c, static_cast<int>(i++));
} }
timer.stop(); timer.stop();
c.clear(); c.clear();
timer.resume();
} }
timer.stop(); timer.stop();
@@ -216,7 +233,7 @@ void vector_test_template(std::size_t num_iterations, std::size_t num_elements,
std::cout << cont_name << "->" << op.name() <<" ns: " std::cout << cont_name << "->" << op.name() <<" ns: "
<< float(nseconds)/(num_iterations*num_elements) << float(nseconds)/(num_iterations*num_elements)
<< '\t' << '\t'
<< "Capacity: " << (unsigned int)capacity << "Capacity: " << capacity
<< "\n"; << "\n";
} }