Fix wrong namespacing of benchmarking constructor helpers

This commit is contained in:
Joe Burzinski 2019-11-18 22:22:38 -06:00 committed by Martin Hořeňovský
parent a537ccae22
commit cfba9dce97
3 changed files with 66 additions and 52 deletions

View File

@ -189,19 +189,17 @@ construct and destroy objects without dynamic allocation and in a way that lets
you measure construction and destruction separately. you measure construction and destruction separately.
```c++ ```c++
BENCHMARK_ADVANCED("construct")(Catch::Benchmark::Chronometer meter) BENCHMARK_ADVANCED("construct")(Catch::Benchmark::Chronometer meter) {
{
std::vector<Catch::Benchmark::storage_for<std::string>> storage(meter.runs()); std::vector<Catch::Benchmark::storage_for<std::string>> storage(meter.runs());
meter.measure([&](int i) { storage[i].construct("thing"); }); meter.measure([&](int i) { storage[i].construct("thing"); });
}) };
BENCHMARK_ADVANCED("destroy", [](Catch::Benchmark::Chronometer meter) BENCHMARK_ADVANCED("destroy")(Catch::Benchmark::Chronometer meter) {
{
std::vector<Catch::Benchmark::destructable_object<std::string>> storage(meter.runs()); std::vector<Catch::Benchmark::destructable_object<std::string>> storage(meter.runs());
for(auto&& o : storage) for(auto&& o : storage)
o.construct("thing"); o.construct("thing");
meter.measure([&](int i) { storage[i].destruct(); }); meter.measure([&](int i) { storage[i].destruct(); });
}) };
``` ```
`Catch::Benchmark::storage_for<T>` objects are just pieces of raw storage suitable for `T` `Catch::Benchmark::storage_for<T>` objects are just pieces of raw storage suitable for `T`

View File

@ -14,6 +14,7 @@
#include <type_traits> #include <type_traits>
namespace Catch { namespace Catch {
namespace Benchmark {
namespace Detail { namespace Detail {
template <typename T, bool Destruct> template <typename T, bool Destruct>
struct ObjectStorage struct ObjectStorage
@ -68,6 +69,7 @@ namespace Catch {
template <typename T> template <typename T>
using destructable_object = Detail::ObjectStorage<T, false>; using destructable_object = Detail::ObjectStorage<T, false>;
}
} }
#endif // TWOBLUECUBES_CATCH_CONSTRUCTOR_HPP_INCLUDED #endif // TWOBLUECUBES_CATCH_CONSTRUCTOR_HPP_INCLUDED

View File

@ -126,5 +126,19 @@ TEST_CASE("Benchmark containers", "[!benchmark]") {
REQUIRE(v[i] == generated); REQUIRE(v[i] == generated);
} }
} }
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(); });
};
}
} }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING #endif // CATCH_CONFIG_ENABLE_BENCHMARKING