Skip to content

Instantly share code, notes, and snippets.

@ecatmur
Created September 3, 2014 09:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ecatmur/8c0b50dc4e30e1206a98 to your computer and use it in GitHub Desktop.
Save ecatmur/8c0b50dc4e30e1206a98 to your computer and use it in GitHub Desktop.
max_element benchmarking
#include <nonius/main.h++>
#include <vector>
#include <algorithm>
namespace my {
int* max_element1(int* first, int* last)
{
int* result = first;
while(++first != last)
if(*result < *first)
result = first;
return result;
}
int* max_element2(int* first, int* last)
{
int* result = first;
++first;
for(; first != last; ++first)
if(*result < *first)
result = first;
return result;
}
int* max_element3(int* first, int* last)
{
int* result = first, prev = *result;
while(++first != last)
if(prev < *first)
result = first, prev = *result;
return result;
}
decltype(max_element1)* max_element_f[] = {max_element1, max_element2, max_element3};
}
std::vector<int> make_test_vector()
{
const int size = 1 << 20;
std::vector<int> vec;
for (int i = 0; i < size; i++)
{
if (i == 59)
{
vec.push_back(1000000012);
}
else
{
vec.push_back(i);
}
}
return vec;
}
NONIUS_BENCHMARK("with while", [](nonius::chronometer meter)
{
auto data = make_test_vector();
meter.measure([&] { volatile int i = *my::max_element_f[0](&*data.begin(), &*data.end()); });
})
NONIUS_BENCHMARK("with for", [](nonius::chronometer meter)
{
auto data = make_test_vector();
meter.measure([&] { volatile int i = *my::max_element_f[1](&*data.begin(), &*data.end()); });
})
NONIUS_BENCHMARK("commoned", [](nonius::chronometer meter)
{
auto data = make_test_vector();
meter.measure([&] { volatile int i = *my::max_element_f[2](&*data.begin(), &*data.end()); });
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment