xref: /aosp_15_r20/external/flatbuffers/benchmarks/cpp/benchmark_main.cpp (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
2*890232f2SAndroid Build Coastguard Worker #include <gtest/gtest.h>
3*890232f2SAndroid Build Coastguard Worker 
4*890232f2SAndroid Build Coastguard Worker #include "benchmarks/cpp/bench.h"
5*890232f2SAndroid Build Coastguard Worker #include "benchmarks/cpp/flatbuffers/fb_bench.h"
6*890232f2SAndroid Build Coastguard Worker #include "benchmarks/cpp/raw/raw_bench.h"
7*890232f2SAndroid Build Coastguard Worker 
Encode(benchmark::State & state,std::unique_ptr<Bench> & bench,uint8_t * buffer)8*890232f2SAndroid Build Coastguard Worker static inline void Encode(benchmark::State &state,
9*890232f2SAndroid Build Coastguard Worker                           std::unique_ptr<Bench> &bench, uint8_t *buffer) {
10*890232f2SAndroid Build Coastguard Worker   int64_t length;
11*890232f2SAndroid Build Coastguard Worker   for (auto _ : state) {
12*890232f2SAndroid Build Coastguard Worker     bench->Encode(buffer, length);
13*890232f2SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(length);
14*890232f2SAndroid Build Coastguard Worker   }
15*890232f2SAndroid Build Coastguard Worker }
16*890232f2SAndroid Build Coastguard Worker 
Decode(benchmark::State & state,std::unique_ptr<Bench> & bench,uint8_t * buffer)17*890232f2SAndroid Build Coastguard Worker static inline void Decode(benchmark::State &state,
18*890232f2SAndroid Build Coastguard Worker                           std::unique_ptr<Bench> &bench, uint8_t *buffer) {
19*890232f2SAndroid Build Coastguard Worker   int64_t length;
20*890232f2SAndroid Build Coastguard Worker   uint8_t *encoded = bench->Encode(buffer, length);
21*890232f2SAndroid Build Coastguard Worker 
22*890232f2SAndroid Build Coastguard Worker   for (auto _ : state) {
23*890232f2SAndroid Build Coastguard Worker     void *decoded = bench->Decode(encoded, length);
24*890232f2SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(decoded);
25*890232f2SAndroid Build Coastguard Worker   }
26*890232f2SAndroid Build Coastguard Worker }
27*890232f2SAndroid Build Coastguard Worker 
Use(benchmark::State & state,std::unique_ptr<Bench> & bench,uint8_t * buffer,int64_t check_sum)28*890232f2SAndroid Build Coastguard Worker static inline void Use(benchmark::State &state, std::unique_ptr<Bench> &bench,
29*890232f2SAndroid Build Coastguard Worker                        uint8_t *buffer, int64_t check_sum) {
30*890232f2SAndroid Build Coastguard Worker   int64_t length;
31*890232f2SAndroid Build Coastguard Worker   uint8_t *encoded = bench->Encode(buffer, length);
32*890232f2SAndroid Build Coastguard Worker   void *decoded = bench->Decode(encoded, length);
33*890232f2SAndroid Build Coastguard Worker 
34*890232f2SAndroid Build Coastguard Worker   int64_t sum = 0;
35*890232f2SAndroid Build Coastguard Worker 
36*890232f2SAndroid Build Coastguard Worker   for (auto _ : state) { sum = bench->Use(decoded); }
37*890232f2SAndroid Build Coastguard Worker 
38*890232f2SAndroid Build Coastguard Worker   EXPECT_EQ(sum, check_sum);
39*890232f2SAndroid Build Coastguard Worker }
40*890232f2SAndroid Build Coastguard Worker 
BM_Flatbuffers_Encode(benchmark::State & state)41*890232f2SAndroid Build Coastguard Worker static void BM_Flatbuffers_Encode(benchmark::State &state) {
42*890232f2SAndroid Build Coastguard Worker   const int64_t kBufferLength = 1024;
43*890232f2SAndroid Build Coastguard Worker   uint8_t buffer[kBufferLength];
44*890232f2SAndroid Build Coastguard Worker 
45*890232f2SAndroid Build Coastguard Worker   StaticAllocator allocator(&buffer[0]);
46*890232f2SAndroid Build Coastguard Worker   std::unique_ptr<Bench> bench = NewFlatBuffersBench(kBufferLength, &allocator);
47*890232f2SAndroid Build Coastguard Worker   Encode(state, bench, buffer);
48*890232f2SAndroid Build Coastguard Worker }
49*890232f2SAndroid Build Coastguard Worker BENCHMARK(BM_Flatbuffers_Encode);
50*890232f2SAndroid Build Coastguard Worker 
BM_Flatbuffers_Decode(benchmark::State & state)51*890232f2SAndroid Build Coastguard Worker static void BM_Flatbuffers_Decode(benchmark::State &state) {
52*890232f2SAndroid Build Coastguard Worker   const int64_t kBufferLength = 1024;
53*890232f2SAndroid Build Coastguard Worker   uint8_t buffer[kBufferLength];
54*890232f2SAndroid Build Coastguard Worker 
55*890232f2SAndroid Build Coastguard Worker   StaticAllocator allocator(&buffer[0]);
56*890232f2SAndroid Build Coastguard Worker   std::unique_ptr<Bench> bench = NewFlatBuffersBench(kBufferLength, &allocator);
57*890232f2SAndroid Build Coastguard Worker   Decode(state, bench, buffer);
58*890232f2SAndroid Build Coastguard Worker }
59*890232f2SAndroid Build Coastguard Worker BENCHMARK(BM_Flatbuffers_Decode);
60*890232f2SAndroid Build Coastguard Worker 
BM_Flatbuffers_Use(benchmark::State & state)61*890232f2SAndroid Build Coastguard Worker static void BM_Flatbuffers_Use(benchmark::State &state) {
62*890232f2SAndroid Build Coastguard Worker   const int64_t kBufferLength = 1024;
63*890232f2SAndroid Build Coastguard Worker   uint8_t buffer[kBufferLength];
64*890232f2SAndroid Build Coastguard Worker 
65*890232f2SAndroid Build Coastguard Worker   StaticAllocator allocator(&buffer[0]);
66*890232f2SAndroid Build Coastguard Worker   std::unique_ptr<Bench> bench = NewFlatBuffersBench(kBufferLength, &allocator);
67*890232f2SAndroid Build Coastguard Worker   Use(state, bench, buffer, 218812692406581874);
68*890232f2SAndroid Build Coastguard Worker }
69*890232f2SAndroid Build Coastguard Worker BENCHMARK(BM_Flatbuffers_Use);
70*890232f2SAndroid Build Coastguard Worker 
BM_Raw_Encode(benchmark::State & state)71*890232f2SAndroid Build Coastguard Worker static void BM_Raw_Encode(benchmark::State &state) {
72*890232f2SAndroid Build Coastguard Worker   const int64_t kBufferLength = 1024;
73*890232f2SAndroid Build Coastguard Worker   uint8_t buffer[kBufferLength];
74*890232f2SAndroid Build Coastguard Worker 
75*890232f2SAndroid Build Coastguard Worker   std::unique_ptr<Bench> bench = NewRawBench();
76*890232f2SAndroid Build Coastguard Worker   Encode(state, bench, buffer);
77*890232f2SAndroid Build Coastguard Worker }
78*890232f2SAndroid Build Coastguard Worker BENCHMARK(BM_Raw_Encode);
79*890232f2SAndroid Build Coastguard Worker 
BM_Raw_Decode(benchmark::State & state)80*890232f2SAndroid Build Coastguard Worker static void BM_Raw_Decode(benchmark::State &state) {
81*890232f2SAndroid Build Coastguard Worker   const int64_t kBufferLength = 1024;
82*890232f2SAndroid Build Coastguard Worker   uint8_t buffer[kBufferLength];
83*890232f2SAndroid Build Coastguard Worker 
84*890232f2SAndroid Build Coastguard Worker   std::unique_ptr<Bench> bench = NewRawBench();
85*890232f2SAndroid Build Coastguard Worker   Decode(state, bench, buffer);
86*890232f2SAndroid Build Coastguard Worker }
87*890232f2SAndroid Build Coastguard Worker BENCHMARK(BM_Raw_Decode);
88*890232f2SAndroid Build Coastguard Worker 
BM_Raw_Use(benchmark::State & state)89*890232f2SAndroid Build Coastguard Worker static void BM_Raw_Use(benchmark::State &state) {
90*890232f2SAndroid Build Coastguard Worker   const int64_t kBufferLength = 1024;
91*890232f2SAndroid Build Coastguard Worker   uint8_t buffer[kBufferLength];
92*890232f2SAndroid Build Coastguard Worker 
93*890232f2SAndroid Build Coastguard Worker   std::unique_ptr<Bench> bench = NewRawBench();
94*890232f2SAndroid Build Coastguard Worker   Use(state, bench, buffer, 218812692406581874);
95*890232f2SAndroid Build Coastguard Worker }
96*890232f2SAndroid Build Coastguard Worker BENCHMARK(BM_Raw_Use);
97