1 #include "benchmarks/cpp/flatbuffers/fb_bench.h"
2
3 #include <cstdint>
4 #include <memory>
5
6 #include "benchmarks/cpp/bench.h"
7 #include "benchmarks/cpp/flatbuffers/bench_generated.h"
8 #include "flatbuffers/flatbuffers.h"
9
10 using namespace flatbuffers;
11 using namespace benchmarks_flatbuffers;
12
13 namespace {
14
15 struct FlatBufferBench : Bench {
FlatBufferBench__anon0275cd3f0111::FlatBufferBench16 explicit FlatBufferBench(int64_t initial_size, Allocator *allocator)
17 : fbb(initial_size, allocator, false) {}
18
Encode__anon0275cd3f0111::FlatBufferBench19 uint8_t *Encode(void *, int64_t &len) override {
20 fbb.Clear();
21
22 const int kVectorLength = 3;
23 Offset<FooBar> vec[kVectorLength];
24
25 for (int i = 0; i < kVectorLength; ++i) {
26 Foo foo(0xABADCAFEABADCAFE + i, 10000 + i, '@' + i, 1000000 + i);
27 Bar bar(foo, 123456 + i, 3.14159f + i, 10000 + i);
28 auto name = fbb.CreateString("Hello, World!");
29 auto foobar =
30 CreateFooBar(fbb, &bar, name, 3.1415432432445543543 + i, '!' + i);
31 vec[i] = foobar;
32 }
33 auto location = fbb.CreateString("http://google.com/flatbuffers/");
34 auto foobarvec = fbb.CreateVector(vec, kVectorLength);
35 auto foobarcontainer =
36 CreateFooBarContainer(fbb, foobarvec, true, Enum_Bananas, location);
37 fbb.Finish(foobarcontainer);
38
39 len = fbb.GetSize();
40 return fbb.GetBufferPointer();
41 }
42
Use__anon0275cd3f0111::FlatBufferBench43 int64_t Use(void *decoded) override {
44 sum = 0;
45 auto foobarcontainer = GetFooBarContainer(decoded);
46 sum = 0;
47 Add(foobarcontainer->initialized());
48 Add(foobarcontainer->location()->Length());
49 Add(foobarcontainer->fruit());
50 for (unsigned int i = 0; i < foobarcontainer->list()->Length(); i++) {
51 auto foobar = foobarcontainer->list()->Get(i);
52 Add(foobar->name()->Length());
53 Add(foobar->postfix());
54 Add(static_cast<int64_t>(foobar->rating()));
55 auto bar = foobar->sibling();
56 Add(static_cast<int64_t>(bar->ratio()));
57 Add(bar->size());
58 Add(bar->time());
59 auto &foo = bar->parent();
60 Add(foo.count());
61 Add(foo.id());
62 Add(foo.length());
63 Add(foo.prefix());
64 }
65 return sum;
66 }
67
Decode__anon0275cd3f0111::FlatBufferBench68 void *Decode(void *buffer, int64_t) override { return buffer; }
Dealloc__anon0275cd3f0111::FlatBufferBench69 void Dealloc(void *) override {};
70
71 FlatBufferBuilder fbb;
72 };
73
74 } // namespace
75
NewFlatBuffersBench(int64_t initial_size,Allocator * allocator)76 std::unique_ptr<Bench> NewFlatBuffersBench(int64_t initial_size,
77 Allocator *allocator) {
78 return std::unique_ptr<FlatBufferBench>(
79 new FlatBufferBench(initial_size, allocator));
80 }
81