#include #include "components/esm/refid.hpp" #include #include #include #include #include namespace { constexpr std::size_t refIdsCount = 64 * 1024; template std::string generateText(std::size_t size, Random& random) { std::uniform_int_distribution distribution('A', 'z'); std::string result; result.reserve(size); std::generate_n(std::back_inserter(result), size, [&] { return distribution(random); }); return result; } template std::vector generateStringRefIds(std::size_t size, Random& random) { std::vector result; result.reserve(refIdsCount); std::generate_n( std::back_inserter(result), refIdsCount, [&] { return ESM::StringRefId(generateText(size, random)); }); return result; } template std::vector generateSerializedRefIds(const std::vector& generated, Serialize&& serialize) { std::vector result; result.reserve(generated.size()); for (ESM::RefId refId : generated) result.push_back(serialize(refId)); return result; } template std::vector generateSerializedStringRefIds(std::size_t size, Random& random, Serialize&& serialize) { return generateSerializedRefIds(generateStringRefIds(size, random), serialize); } void serializeRefId(benchmark::State& state) { std::minstd_rand random; std::vector refIds = generateStringRefIds(state.range(0), random); std::size_t i = 0; for (auto _ : state) { benchmark::DoNotOptimize(refIds[i].serialize()); if (++i >= refIds.size()) i = 0; } } void deserializeRefId(benchmark::State& state) { std::minstd_rand random; std::vector serializedRefIds = generateSerializedStringRefIds(state.range(0), random, [](ESM::RefId v) { return v.serialize(); }); std::size_t i = 0; for (auto _ : state) { benchmark::DoNotOptimize(ESM::RefId::deserialize(serializedRefIds[i])); if (++i >= serializedRefIds.size()) i = 0; } } } BENCHMARK(serializeRefId)->RangeMultiplier(4)->Range(8, 64); BENCHMARK(deserializeRefId)->RangeMultiplier(4)->Range(8, 64); BENCHMARK_MAIN();