xref: /aosp_15_r20/external/flatbuffers/benchmarks/cpp/raw/raw_bench.cpp (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker #include "benchmarks/cpp/raw/raw_bench.h"
2*890232f2SAndroid Build Coastguard Worker 
3*890232f2SAndroid Build Coastguard Worker #include <cstdint>
4*890232f2SAndroid Build Coastguard Worker #include <cstring>
5*890232f2SAndroid Build Coastguard Worker #include <memory>
6*890232f2SAndroid Build Coastguard Worker 
7*890232f2SAndroid Build Coastguard Worker #include "benchmarks/cpp/bench.h"
8*890232f2SAndroid Build Coastguard Worker 
9*890232f2SAndroid Build Coastguard Worker namespace {
10*890232f2SAndroid Build Coastguard Worker const int64_t kStringLength = 32;
11*890232f2SAndroid Build Coastguard Worker const int64_t kVectorLength = 3;
12*890232f2SAndroid Build Coastguard Worker 
13*890232f2SAndroid Build Coastguard Worker enum Enum { Apples, Pears, Bananas };
14*890232f2SAndroid Build Coastguard Worker 
15*890232f2SAndroid Build Coastguard Worker struct Foo {
16*890232f2SAndroid Build Coastguard Worker   int64_t id;
17*890232f2SAndroid Build Coastguard Worker   short count;
18*890232f2SAndroid Build Coastguard Worker   char prefix;
19*890232f2SAndroid Build Coastguard Worker   int length;
20*890232f2SAndroid Build Coastguard Worker };
21*890232f2SAndroid Build Coastguard Worker 
22*890232f2SAndroid Build Coastguard Worker struct Bar {
23*890232f2SAndroid Build Coastguard Worker   Foo parent;
24*890232f2SAndroid Build Coastguard Worker   int time;
25*890232f2SAndroid Build Coastguard Worker   float ratio;
26*890232f2SAndroid Build Coastguard Worker   unsigned short size;
27*890232f2SAndroid Build Coastguard Worker };
28*890232f2SAndroid Build Coastguard Worker 
29*890232f2SAndroid Build Coastguard Worker struct FooBar {
30*890232f2SAndroid Build Coastguard Worker   Bar sibling;
31*890232f2SAndroid Build Coastguard Worker   // We have to stick this in, otherwise strlen() will make it slower than
32*890232f2SAndroid Build Coastguard Worker   // FlatBuffers:
33*890232f2SAndroid Build Coastguard Worker   int name_len;
34*890232f2SAndroid Build Coastguard Worker   char name[kStringLength];
35*890232f2SAndroid Build Coastguard Worker   double rating;
36*890232f2SAndroid Build Coastguard Worker   unsigned char postfix;
37*890232f2SAndroid Build Coastguard Worker };
38*890232f2SAndroid Build Coastguard Worker 
39*890232f2SAndroid Build Coastguard Worker struct FooBarContainer {
40*890232f2SAndroid Build Coastguard Worker   FooBar list[kVectorLength];  // 3 copies of the above
41*890232f2SAndroid Build Coastguard Worker   bool initialized;
42*890232f2SAndroid Build Coastguard Worker   Enum fruit;
43*890232f2SAndroid Build Coastguard Worker   int location_len;
44*890232f2SAndroid Build Coastguard Worker   char location[kStringLength];
45*890232f2SAndroid Build Coastguard Worker };
46*890232f2SAndroid Build Coastguard Worker 
47*890232f2SAndroid Build Coastguard Worker struct RawBench : Bench {
Encode__anon619f21bc0111::RawBench48*890232f2SAndroid Build Coastguard Worker   uint8_t *Encode(void *buf, int64_t &len) override {
49*890232f2SAndroid Build Coastguard Worker     FooBarContainer *fbc = new (buf) FooBarContainer;
50*890232f2SAndroid Build Coastguard Worker     strcpy(fbc->location, "http://google.com/flatbuffers/");  // Unsafe eek!
51*890232f2SAndroid Build Coastguard Worker     fbc->location_len = (int)strlen(fbc->location);
52*890232f2SAndroid Build Coastguard Worker     fbc->fruit = Bananas;
53*890232f2SAndroid Build Coastguard Worker     fbc->initialized = true;
54*890232f2SAndroid Build Coastguard Worker     for (int i = 0; i < kVectorLength; i++) {
55*890232f2SAndroid Build Coastguard Worker       // We add + i to not make these identical copies for a more realistic
56*890232f2SAndroid Build Coastguard Worker       // compression test.
57*890232f2SAndroid Build Coastguard Worker       auto &foobar = fbc->list[i];
58*890232f2SAndroid Build Coastguard Worker       foobar.rating = 3.1415432432445543543 + i;
59*890232f2SAndroid Build Coastguard Worker       foobar.postfix = '!' + i;
60*890232f2SAndroid Build Coastguard Worker       strcpy(foobar.name, "Hello, World!");
61*890232f2SAndroid Build Coastguard Worker       foobar.name_len = (int)strlen(foobar.name);
62*890232f2SAndroid Build Coastguard Worker       auto &bar = foobar.sibling;
63*890232f2SAndroid Build Coastguard Worker       bar.ratio = 3.14159f + i;
64*890232f2SAndroid Build Coastguard Worker       bar.size = 10000 + i;
65*890232f2SAndroid Build Coastguard Worker       bar.time = 123456 + i;
66*890232f2SAndroid Build Coastguard Worker       auto &foo = bar.parent;
67*890232f2SAndroid Build Coastguard Worker       foo.id = 0xABADCAFEABADCAFE + i;
68*890232f2SAndroid Build Coastguard Worker       foo.count = 10000 + i;
69*890232f2SAndroid Build Coastguard Worker       foo.length = 1000000 + i;
70*890232f2SAndroid Build Coastguard Worker       foo.prefix = '@' + i;
71*890232f2SAndroid Build Coastguard Worker     }
72*890232f2SAndroid Build Coastguard Worker 
73*890232f2SAndroid Build Coastguard Worker     len = sizeof(FooBarContainer);
74*890232f2SAndroid Build Coastguard Worker     return reinterpret_cast<uint8_t *>(fbc);
75*890232f2SAndroid Build Coastguard Worker   };
76*890232f2SAndroid Build Coastguard Worker 
Use__anon619f21bc0111::RawBench77*890232f2SAndroid Build Coastguard Worker   int64_t Use(void *decoded) override {
78*890232f2SAndroid Build Coastguard Worker     auto foobarcontainer = reinterpret_cast<FooBarContainer *>(decoded);
79*890232f2SAndroid Build Coastguard Worker     sum = 0;
80*890232f2SAndroid Build Coastguard Worker     Add(foobarcontainer->initialized);
81*890232f2SAndroid Build Coastguard Worker     Add(foobarcontainer->location_len);
82*890232f2SAndroid Build Coastguard Worker     Add(foobarcontainer->fruit);
83*890232f2SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < kVectorLength; i++) {
84*890232f2SAndroid Build Coastguard Worker       auto foobar = &foobarcontainer->list[i];
85*890232f2SAndroid Build Coastguard Worker       Add(foobar->name_len);
86*890232f2SAndroid Build Coastguard Worker       Add(foobar->postfix);
87*890232f2SAndroid Build Coastguard Worker       Add(static_cast<int64_t>(foobar->rating));
88*890232f2SAndroid Build Coastguard Worker       auto bar = &foobar->sibling;
89*890232f2SAndroid Build Coastguard Worker       Add(static_cast<int64_t>(bar->ratio));
90*890232f2SAndroid Build Coastguard Worker       Add(bar->size);
91*890232f2SAndroid Build Coastguard Worker       Add(bar->time);
92*890232f2SAndroid Build Coastguard Worker       auto &foo = bar->parent;
93*890232f2SAndroid Build Coastguard Worker       Add(foo.count);
94*890232f2SAndroid Build Coastguard Worker       Add(foo.id);
95*890232f2SAndroid Build Coastguard Worker       Add(foo.length);
96*890232f2SAndroid Build Coastguard Worker       Add(foo.prefix);
97*890232f2SAndroid Build Coastguard Worker     }
98*890232f2SAndroid Build Coastguard Worker     return sum;
99*890232f2SAndroid Build Coastguard Worker   }
100*890232f2SAndroid Build Coastguard Worker 
Decode__anon619f21bc0111::RawBench101*890232f2SAndroid Build Coastguard Worker   void *Decode(void *buf, int64_t) override { return buf; }
Dealloc__anon619f21bc0111::RawBench102*890232f2SAndroid Build Coastguard Worker   void Dealloc(void *) override{};
103*890232f2SAndroid Build Coastguard Worker };
104*890232f2SAndroid Build Coastguard Worker 
105*890232f2SAndroid Build Coastguard Worker }  // namespace
106*890232f2SAndroid Build Coastguard Worker 
NewRawBench()107*890232f2SAndroid Build Coastguard Worker std::unique_ptr<Bench> NewRawBench() {
108*890232f2SAndroid Build Coastguard Worker   return std::unique_ptr<RawBench>(new RawBench());
109*890232f2SAndroid Build Coastguard Worker }
110