#include "benchmarks/cpp/raw/raw_bench.h" #include #include #include #include "benchmarks/cpp/bench.h" namespace { const int64_t kStringLength = 32; const int64_t kVectorLength = 3; enum Enum { Apples, Pears, Bananas }; struct Foo { int64_t id; short count; char prefix; int length; }; struct Bar { Foo parent; int time; float ratio; unsigned short size; }; struct FooBar { Bar sibling; // We have to stick this in, otherwise strlen() will make it slower than // FlatBuffers: int name_len; char name[kStringLength]; double rating; unsigned char postfix; }; struct FooBarContainer { FooBar list[kVectorLength]; // 3 copies of the above bool initialized; Enum fruit; int location_len; char location[kStringLength]; }; struct RawBench : Bench { uint8_t *Encode(void *buf, int64_t &len) override { FooBarContainer *fbc = new (buf) FooBarContainer; strcpy(fbc->location, "http://google.com/flatbuffers/"); // Unsafe eek! fbc->location_len = (int)strlen(fbc->location); fbc->fruit = Bananas; fbc->initialized = true; for (int i = 0; i < kVectorLength; i++) { // We add + i to not make these identical copies for a more realistic // compression test. auto &foobar = fbc->list[i]; foobar.rating = 3.1415432432445543543 + i; foobar.postfix = '!' + i; strcpy(foobar.name, "Hello, World!"); foobar.name_len = (int)strlen(foobar.name); auto &bar = foobar.sibling; bar.ratio = 3.14159f + i; bar.size = 10000 + i; bar.time = 123456 + i; auto &foo = bar.parent; foo.id = 0xABADCAFEABADCAFE + i; foo.count = 10000 + i; foo.length = 1000000 + i; foo.prefix = '@' + i; } len = sizeof(FooBarContainer); return reinterpret_cast(fbc); }; int64_t Use(void *decoded) override { auto foobarcontainer = reinterpret_cast(decoded); sum = 0; Add(foobarcontainer->initialized); Add(foobarcontainer->location_len); Add(foobarcontainer->fruit); for (unsigned int i = 0; i < kVectorLength; i++) { auto foobar = &foobarcontainer->list[i]; Add(foobar->name_len); Add(foobar->postfix); Add(static_cast(foobar->rating)); auto bar = &foobar->sibling; Add(static_cast(bar->ratio)); Add(bar->size); Add(bar->time); auto &foo = bar->parent; Add(foo.count); Add(foo.id); Add(foo.length); Add(foo.prefix); } return sum; } void *Decode(void *buf, int64_t) override { return buf; } void Dealloc(void *) override{}; }; } // namespace std::unique_ptr NewRawBench() { return std::unique_ptr(new RawBench()); }