123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- // X20-BenchmarkingMacros.cpp
- // Test that the benchmarking support macros compile properly with the single header
- #define CATCH_CONFIG_MAIN
- #include <catch2/catch.hpp>
- namespace {
- std::uint64_t factorial(std::uint64_t number) {
- if (number < 2) {
- return 1;
- }
- return number * factorial(number - 1);
- }
- }
- TEST_CASE("Benchmark factorial", "[benchmark]") {
- CHECK(factorial(0) == 1);
- // some more asserts..
- CHECK(factorial(10) == 3628800);
- BENCHMARK("factorial 10") {
- return factorial(10);
- };
- CHECK(factorial(14) == 87178291200ull);
- BENCHMARK("factorial 14") {
- return factorial(14);
- };
- }
- TEST_CASE("Benchmark containers", "[.][benchmark]") {
- static const int size = 100;
- std::vector<int> v;
- std::map<int, int> m;
- SECTION("without generator") {
- BENCHMARK("Load up a vector") {
- v = std::vector<int>();
- for (int i = 0; i < size; ++i)
- v.push_back(i);
- };
- REQUIRE(v.size() == size);
- // test optimizer control
- BENCHMARK("Add up a vector's content") {
- uint64_t add = 0;
- for (int i = 0; i < size; ++i)
- add += v[i];
- return add;
- };
- BENCHMARK("Load up a map") {
- m = std::map<int, int>();
- for (int i = 0; i < size; ++i)
- m.insert({ i, i + 1 });
- };
- REQUIRE(m.size() == size);
- BENCHMARK("Reserved vector") {
- v = std::vector<int>();
- v.reserve(size);
- for (int i = 0; i < size; ++i)
- v.push_back(i);
- };
- REQUIRE(v.size() == size);
- BENCHMARK("Resized vector") {
- v = std::vector<int>();
- v.resize(size);
- for (int i = 0; i < size; ++i)
- v[i] = i;
- };
- REQUIRE(v.size() == size);
- int array[size];
- BENCHMARK("A fixed size array that should require no allocations") {
- for (int i = 0; i < size; ++i)
- array[i] = i;
- };
- int sum = 0;
- for (int i = 0; i < size; ++i)
- sum += array[i];
- REQUIRE(sum > size);
- SECTION("XYZ") {
- BENCHMARK_ADVANCED("Load up vector with chronometer")(Catch::Benchmark::Chronometer meter) {
- std::vector<int> k;
- meter.measure([&](int idx) {
- k = std::vector<int>();
- for (int i = 0; i < size; ++i)
- k.push_back(idx);
- });
- REQUIRE(k.size() == size);
- };
- int runs = 0;
- BENCHMARK("Fill vector indexed", benchmarkIndex) {
- v = std::vector<int>();
- v.resize(size);
- for (int i = 0; i < size; ++i)
- v[i] = benchmarkIndex;
- runs = benchmarkIndex;
- };
- for (size_t i = 0; i < v.size(); ++i) {
- REQUIRE(v[i] == runs);
- }
- }
- }
- SECTION("with generator") {
- auto generated = GENERATE(range(0, 10));
- BENCHMARK("Fill vector generated") {
- v = std::vector<int>();
- v.resize(size);
- for (int i = 0; i < size; ++i)
- v[i] = generated;
- };
- for (size_t i = 0; i < v.size(); ++i) {
- REQUIRE(v[i] == generated);
- }
- }
- }
|