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 Workerstd::unique_ptr<Bench> NewRawBench() { 108*890232f2SAndroid Build Coastguard Worker return std::unique_ptr<RawBench>(new RawBench()); 109*890232f2SAndroid Build Coastguard Worker } 110