Minmax_element Performance
About performance
Of course, there are many factors that affect the performance of an algorithm.
The number of comparison is only one, but also branch prediction, pipelining,
locality of reference (affects cache efficiency), etc. In practice,
we observe that when the iterator type is a pointer,
boost::minmax_element
is only a tad slower than
std::min_element, and is even faster
than
boost::first_min_last_max_element! This is even more true
for slower iterators (list<>::iterator or
map<>iterator
for instance). The following experiments were conducted on a Pentium III
500 Mhz running Linux and compiled with g++, version 2.95.2, flags -O3.
In the tables, we use different distributions: Identical means that
all the elements are identical, 2-valued means that we replace the
second half of the identical elements by a distinct element, increasing
means that all the elements are distinct and in increasing order, decreasing
is the reverse, and random is produced by random_shuffle.
The program that created these tables is included in the distribution,
under minmax_timer.cpp
vector<int>::iterator |
Identical |
2-valued |
Increasing |
Decreasing |
Random |
std::min_element |
23.26M/s |
23.26M/s |
23.15M/s |
22.94M/s |
22.94M/s |
std::max_element |
23.26M/s |
23.26M/s |
23.15M/s |
22.94M/s |
22.62M/s |
boost::first_min_element |
23.15M/s |
23.04M/s |
23.04M/s |
22.94M/s |
22.83M/s |
boost::last_min_element |
23.26M/s |
23.26M/s |
23.26M/s |
22.83M/s |
16.23M/s |
boost::first_max_element |
23.15M/s |
23.26M/s |
23.15M/s |
23.04M/s |
22.93M/s |
boost::last_max_element |
23.26M/s |
23.15M/s |
23.15M/s |
22.94M/s |
16.18M/s |
boost::minmax_element |
21.83M/s |
21.83M/s |
21.83M/s |
21.55M/s |
17.79M/s |
boost::first_min_last_max_element |
18.52M/s |
18.38M/s |
18.38M/s |
18.94M/s |
16.29M/s |
boost::last_min_first_max_element |
20.08M/s |
20.83M/s |
20.75M/s |
19.76M/s |
15.87M/s |
boost::last_min_last_max_element |
18.66M/s |
19.69M/s |
19.69M/s |
19.23M/s |
15.77M/s |
Number of elements per second for standard vector
container iterators
list<int>::iterator |
Identical |
2-valued |
Increasing |
Decreasing |
Random |
std::min_element |
5.8M/s |
5.8M/s |
5.80M/s |
5.73M/s |
5.73M/s |
std::max_element |
5.81M/s |
5.81M/s |
5.78M/s |
5.73M/s |
5.75M/s |
boost::first_min_element |
5.81M/s |
5.81M/s |
5.79M/s |
5.75M/s |
5.73M/s |
boost::last_min_element |
5.81M/s |
5.80M/s |
5.79M/s |
5.73M/s |
5.03M/s |
boost::first_max_element |
5.81M/s |
5.80M/s |
5.78M/s |
5.74M/s |
5.73M/s |
boost::last_max_element |
5.81M/s |
5.80M/s |
5.79M/s |
5.73M/s |
5.07M/s |
boost::minmax_element |
5.68M/s |
5.80M/s |
5.66M/s |
5.74M/s |
5.30M/s |
boost::first_min_last_max_element |
5.79M/s |
5.81M/s |
5.78M/s |
5.73M/s |
5.04M/s |
boost::last_min_first_max_element |
5.69M/s |
5.79M/s |
5.69M/s |
5.73M/s |
4.84M/s |
boost::last_min_last_max_element |
5.61M/s |
5.79M/s |
5.64M/s |
5.74M/s |
4.75M/s |
Runtimes for standard list container iterators
multiset<int>::iterator |
Identical |
2-valued |
Increasing |
Decreasing |
Random |
std::min_element |
4.03M/s |
4.04M/s |
4.02M/s |
4.04M/s |
2.97M/s |
std::max_element3.007M |
4.02M/s |
4.02M/s |
4.01M/s |
4.02M/s |
2.96M/s |
boost::first_min_element |
4.01M/s |
4.04M/s |
4.03M/s |
4.04M/s |
3.01M/s |
boost::last_min_element |
4.03M/s |
4.04M/s |
4.04M/s |
4.04M/s |
3.00M/s |
boost::first_max_element |
4.04M/s |
4.04M/s |
4.04M/s |
4.06M/s |
3.01M/s |
boost::last_max_element |
4.04M/s |
4.04M/s |
4.03M/s |
4.04M/s |
3.00M/s |
boost::minmax_element |
3.98M/s |
3.99M/s |
3.98M/s |
3.99M/s |
3.00M/s |
boost::first_min_last_max_element |
3.99M/s |
3.98M/s |
3.97M/s |
3.99M/s |
2.99M/s |
boost::last_min_first_max_element |
3.97M/s |
3.98M/s |
3.96M/s |
3.98M/s |
3.00M/s |
boost::last_min_last_max_element |
4.00M/s |
4.00M/s |
4.00M/s |
4.02M/s |
2.97M/s |
Runtimes for standard set/multiset container iterators
Last modified 2004-06-28
© Copyright Hervé
Brönnimann, Polytechnic University, 2002--2004.
Use, modification, and distribution is subject to 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)