| #include <cstdint> |
| #include <random> |
| |
| #include <benchmark/benchmark.h> |
| #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 |