#include #include #include #include "absl/random/random.h" #include "upb/mini_table/field.h" #include "upb/mini_table/message.h" #include "upb/mini_table/message_benchmark.upb_minitable.h" #include "upb/port/def.inc" namespace { static void BM_FindFieldByNumber(benchmark::State& state) { uint32_t min, max; switch (state.range(0)) { case 0: min = 1; max = 169; break; case 1: min = 171; max = 552; break; default: min = 100; // Some dense fields max = 570; // some unknowns break; } const upb_MiniTable* ptr = &third_0party_0upb_0upb_0mini_0table__TestManyFields_msg_init; std::seed_seq seq{1, 2, 3}; benchmark::DoNotOptimize(seq); absl::BitGen bitgen(seq); uint32_t search[1024]; for (auto& s : search) { s = absl::Uniform(bitgen, min, max); } uint32_t i = 0; for (auto _ : state) { const upb_MiniTableField* field = upb_MiniTable_FindFieldByNumber(ptr, search[(i++ % 1024)]); if (field) { uint16_t offset = field->UPB_PRIVATE(offset); benchmark::DoNotOptimize(offset); } } } BENCHMARK(BM_FindFieldByNumber)->Arg(0)->Arg(1)->Arg(2); } // namespace