diff options
Diffstat (limited to 'projects/SelfTest/UsageTests/Benchmark.tests.cpp')
-rw-r--r-- | projects/SelfTest/UsageTests/Benchmark.tests.cpp | 153 |
1 files changed, 127 insertions, 26 deletions
diff --git a/projects/SelfTest/UsageTests/Benchmark.tests.cpp b/projects/SelfTest/UsageTests/Benchmark.tests.cpp index ddf69504..e795ddd1 100644 --- a/projects/SelfTest/UsageTests/Benchmark.tests.cpp +++ b/projects/SelfTest/UsageTests/Benchmark.tests.cpp @@ -2,42 +2,143 @@ #include <map> -TEST_CASE( "benchmarked", "[!benchmark]" ) { +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +namespace { + std::uint64_t Fibonacci(std::uint64_t number) { + return number < 2 ? 1 : Fibonacci(number - 1) + Fibonacci(number - 2); + } +} + +TEST_CASE("Benchmark Fibonacci", "[!benchmark]") { + CHECK(Fibonacci(0) == 1); + // some more asserts.. + CHECK(Fibonacci(5) == 8); + // some more asserts.. + + BENCHMARK("Fibonacci 20") { + return Fibonacci(20); + }; + + BENCHMARK("Fibonacci 25") { + return Fibonacci(25); + }; + BENCHMARK("Fibonacci 30") { + return Fibonacci(30); + }; + + BENCHMARK("Fibonacci 35") { + return Fibonacci(35); + }; +} + +TEST_CASE("Benchmark containers", "[!benchmark]") { static const int size = 100; std::vector<int> v; std::map<int, int> m; - BENCHMARK( "Load up a vector" ) { - v = std::vector<int>(); - for(int i =0; i < size; ++i ) - v.push_back( i ); - } - REQUIRE( v.size() == size ); + 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); - BENCHMARK( "Load up a map" ) { - m = std::map<int, int>(); - for(int i =0; i < size; ++i ) - m.insert( { i, i+1 } ); + // 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); + } + } } - 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 ); + 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); + } } - 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; + SECTION("construct and destroy example") { + BENCHMARK_ADVANCED("construct")(Catch::Benchmark::Chronometer meter) { + std::vector<Catch::Benchmark::storage_for<std::string>> storage(meter.runs()); + meter.measure([&](int i) { storage[i].construct("thing"); }); + }; + + BENCHMARK_ADVANCED("destroy")(Catch::Benchmark::Chronometer meter) { + std::vector<Catch::Benchmark::destructable_object<std::string>> storage(meter.runs()); + for(auto&& o : storage) + o.construct("thing"); + meter.measure([&](int i) { storage[i].destruct(); }); + }; } - int sum = 0; - for(int i =0; i < size; ++i ) - sum += array[i]; - REQUIRE( sum > size ); } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING |