| #include "benchmarks/cpp/raw/raw_bench.h" | |
| #include <cstdint> | |
| #include <cstring> | |
| #include <memory> | |
| #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<uint8_t *>(fbc); | |
| }; | |
| int64_t Use(void *decoded) override { | |
| auto foobarcontainer = reinterpret_cast<FooBarContainer *>(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<int64_t>(foobar->rating)); | |
| auto bar = &foobar->sibling; | |
| Add(static_cast<int64_t>(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<Bench> NewRawBench() { | |
| return std::unique_ptr<RawBench>(new RawBench()); | |
| } |