blob: 9426a37407fabf33eff44173a2b4f2d58b1b4d4e [file]
#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