| 
									
										
										
										
											2017-08-05 11:12:29 +01:00
										 |  |  | #include "catch.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-19 20:54:44 +02:00
										 |  |  | #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
 | 
					
						
							| 
									
										
										
										
											2019-06-02 13:19:09 +02:00
										 |  |  | namespace { | 
					
						
							|  |  |  |     std::uint64_t Fibonacci(std::uint64_t number) { | 
					
						
							|  |  |  |         return number < 2 ? 1 : Fibonacci(number - 1) + Fibonacci(number - 2); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-23 23:41:13 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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]") { | 
					
						
							| 
									
										
										
										
											2017-08-05 11:12:29 +01:00
										 |  |  |     static const int size = 100; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::vector<int> v; | 
					
						
							|  |  |  |     std::map<int, int> m; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 23:41:13 +02:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2017-08-05 11:12:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 23:41:13 +02:00
										 |  |  |         // 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; | 
					
						
							|  |  |  |             }; | 
					
						
							| 
									
										
										
										
											2017-08-05 11:12:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 23:41:13 +02:00
										 |  |  |             for (size_t i = 0; i < v.size(); ++i) { | 
					
						
							|  |  |  |                 REQUIRE(v[i] == runs); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-08-05 11:12:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 23:41:13 +02:00
										 |  |  |     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); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-08-05 11:12:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-11-18 22:22:38 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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(); }); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-08-05 11:12:29 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-05-19 20:54:44 +02:00
										 |  |  | #endif // CATCH_CONFIG_ENABLE_BENCHMARKING
 |