Created
August 23, 2017 20:24
-
-
Save endJunction/dfbbadd241f99767824e46730024a957 to your computer and use it in GitHub Desktop.
Benchmark for-range vs std::generate
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <celero/Celero.h> | |
#include <algorithm> | |
#include <numeric> | |
#include <vector> | |
#include <random> | |
CELERO_MAIN; | |
std::random_device rd; | |
std::mt19937 random_number_generator(rd()); | |
std::uniform_real_distribution<double> rnd; | |
std::vector<double> fillVectorRandomlyFor(std::size_t const vector_size) | |
{ | |
std::vector<double> x(vector_size); | |
for (auto& value : x) | |
value = rnd(random_number_generator); | |
return x; | |
} | |
std::vector<double> fillVectorRandomlyGenerate(std::size_t const vector_size) | |
{ | |
std::vector<double> x(vector_size); | |
std::generate(std::begin(x), std::end(x), | |
[&]() { return rnd(random_number_generator); }); | |
return x; | |
} | |
std::vector<double> fillVectorZeroFor(std::size_t const vector_size) | |
{ | |
std::vector<double> x(vector_size); | |
for (auto& value : x) | |
value = 0; | |
return x; | |
} | |
std::vector<double> fillVectorZeroGenerate(std::size_t const vector_size) | |
{ | |
std::vector<double> x(vector_size); | |
std::generate(std::begin(x), std::end(x), [&]() { return 0; }); | |
return x; | |
} | |
std::vector<double> createVector(std::size_t const vector_size) | |
{ | |
std::vector<double> x(vector_size); | |
return x; | |
} | |
std::vector<double> fillVectorIota(std::size_t const vector_size) | |
{ | |
std::vector<double> x(vector_size); | |
std::iota(std::begin(x), std::end(x), 0); | |
return x; | |
} | |
std::vector<double> exerciseRandomGenerator(std::size_t const vector_size) | |
{ | |
std::vector<double> x(vector_size); | |
int const size = x.size(); | |
for (int i = 0; i < size; ++i) | |
rnd(random_number_generator); | |
return x; | |
} | |
BASELINE(A, Create, 30, 10000) | |
{ | |
celero::DoNotOptimizeAway(createVector(100000)); | |
} | |
BENCHMARK(A, fillIota, 30, 10000) | |
{ | |
celero::DoNotOptimizeAway(fillVectorIota(100000)); | |
} | |
BENCHMARK(A, fillZFor, 30, 10000) | |
{ | |
celero::DoNotOptimizeAway(fillVectorZeroFor(100000)); | |
} | |
BENCHMARK(A, fillZGen, 30, 10000) | |
{ | |
celero::DoNotOptimizeAway(fillVectorZeroGenerate(100000)); | |
} | |
BENCHMARK(A, exerciseRNG, 30, 1000) | |
{ | |
celero::DoNotOptimizeAway(exerciseRandomGenerator(100000)); | |
} | |
BENCHMARK(A, fillFor, 30, 1000) | |
{ | |
celero::DoNotOptimizeAway(fillVectorRandomlyFor(100000)); | |
} | |
BENCHMARK(A, fillGenerate, 30, 1000) | |
{ | |
celero::DoNotOptimizeAway(fillVectorRandomlyGenerate(100000)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Needs Celero https://github.com/DigitalInBlue/Celero
Compile with
running yields