1*890232f2SAndroid Build Coastguard Worker /* 2*890232f2SAndroid Build Coastguard Worker * Copyright 2014 Google Inc. All rights reserved. 3*890232f2SAndroid Build Coastguard Worker * 4*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*890232f2SAndroid Build Coastguard Worker * 8*890232f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*890232f2SAndroid Build Coastguard Worker * 10*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*890232f2SAndroid Build Coastguard Worker * limitations under the License. 15*890232f2SAndroid Build Coastguard Worker */ 16*890232f2SAndroid Build Coastguard Worker 17*890232f2SAndroid Build Coastguard Worker using BenchmarkDotNet.Attributes; 18*890232f2SAndroid Build Coastguard Worker using MyGame.Example; 19*890232f2SAndroid Build Coastguard Worker 20*890232f2SAndroid Build Coastguard Worker namespace FlatBuffers.Benchmarks 21*890232f2SAndroid Build Coastguard Worker { 22*890232f2SAndroid Build Coastguard Worker //[EtwProfiler] - needs elevated privileges 23*890232f2SAndroid Build Coastguard Worker [MemoryDiagnoser] 24*890232f2SAndroid Build Coastguard Worker public class FlatBufferBuilderBenchmark 25*890232f2SAndroid Build Coastguard Worker { 26*890232f2SAndroid Build Coastguard Worker private const int NumberOfRows = 10_000; 27*890232f2SAndroid Build Coastguard Worker 28*890232f2SAndroid Build Coastguard Worker [Benchmark] BuildNestedMonster()29*890232f2SAndroid Build Coastguard Worker public void BuildNestedMonster() 30*890232f2SAndroid Build Coastguard Worker { 31*890232f2SAndroid Build Coastguard Worker const string nestedMonsterName = "NestedMonsterName"; 32*890232f2SAndroid Build Coastguard Worker const short nestedMonsterHp = 600; 33*890232f2SAndroid Build Coastguard Worker const short nestedMonsterMana = 1024; 34*890232f2SAndroid Build Coastguard Worker 35*890232f2SAndroid Build Coastguard Worker for (int i = 0; i < NumberOfRows; i++) 36*890232f2SAndroid Build Coastguard Worker { 37*890232f2SAndroid Build Coastguard Worker // Create nested buffer as a Monster type 38*890232f2SAndroid Build Coastguard Worker var fbb1 = new FlatBufferBuilder(16); 39*890232f2SAndroid Build Coastguard Worker var str1 = fbb1.CreateString(nestedMonsterName); 40*890232f2SAndroid Build Coastguard Worker Monster.StartMonster(fbb1); 41*890232f2SAndroid Build Coastguard Worker Monster.AddName(fbb1, str1); 42*890232f2SAndroid Build Coastguard Worker Monster.AddHp(fbb1, nestedMonsterHp); 43*890232f2SAndroid Build Coastguard Worker Monster.AddMana(fbb1, nestedMonsterMana); 44*890232f2SAndroid Build Coastguard Worker var monster1 = Monster.EndMonster(fbb1); 45*890232f2SAndroid Build Coastguard Worker Monster.FinishMonsterBuffer(fbb1, monster1); 46*890232f2SAndroid Build Coastguard Worker var fbb1Bytes = fbb1.SizedByteArray(); 47*890232f2SAndroid Build Coastguard Worker fbb1 = null; 48*890232f2SAndroid Build Coastguard Worker 49*890232f2SAndroid Build Coastguard Worker // Create a Monster which has the first buffer as a nested buffer 50*890232f2SAndroid Build Coastguard Worker var fbb2 = new FlatBufferBuilder(16); 51*890232f2SAndroid Build Coastguard Worker var str2 = fbb2.CreateString("My Monster"); 52*890232f2SAndroid Build Coastguard Worker var nestedBuffer = Monster.CreateTestnestedflatbufferVector(fbb2, fbb1Bytes); 53*890232f2SAndroid Build Coastguard Worker Monster.StartMonster(fbb2); 54*890232f2SAndroid Build Coastguard Worker Monster.AddName(fbb2, str2); 55*890232f2SAndroid Build Coastguard Worker Monster.AddHp(fbb2, 50); 56*890232f2SAndroid Build Coastguard Worker Monster.AddMana(fbb2, 32); 57*890232f2SAndroid Build Coastguard Worker Monster.AddTestnestedflatbuffer(fbb2, nestedBuffer); 58*890232f2SAndroid Build Coastguard Worker var monster = Monster.EndMonster(fbb2); 59*890232f2SAndroid Build Coastguard Worker Monster.FinishMonsterBuffer(fbb2, monster); 60*890232f2SAndroid Build Coastguard Worker } 61*890232f2SAndroid Build Coastguard Worker } 62*890232f2SAndroid Build Coastguard Worker 63*890232f2SAndroid Build Coastguard Worker [Benchmark] BuildMonster()64*890232f2SAndroid Build Coastguard Worker public void BuildMonster() 65*890232f2SAndroid Build Coastguard Worker { 66*890232f2SAndroid Build Coastguard Worker for (int i = 0; i < NumberOfRows; i++) 67*890232f2SAndroid Build Coastguard Worker { 68*890232f2SAndroid Build Coastguard Worker var builder = new FlatBufferBuilder(16); 69*890232f2SAndroid Build Coastguard Worker var str1 = builder.CreateString("MonsterName"); 70*890232f2SAndroid Build Coastguard Worker Monster.StartMonster(builder); 71*890232f2SAndroid Build Coastguard Worker Monster.AddName(builder, str1); 72*890232f2SAndroid Build Coastguard Worker Monster.AddHp(builder, 600); 73*890232f2SAndroid Build Coastguard Worker Monster.AddMana(builder, 1024); 74*890232f2SAndroid Build Coastguard Worker Monster.AddColor(builder, Color.Blue); 75*890232f2SAndroid Build Coastguard Worker Monster.AddTestbool(builder, true); 76*890232f2SAndroid Build Coastguard Worker Monster.AddTestf(builder, 0.3f); 77*890232f2SAndroid Build Coastguard Worker Monster.AddTestf2(builder, 0.2f); 78*890232f2SAndroid Build Coastguard Worker Monster.AddTestf3(builder, 0.1f); 79*890232f2SAndroid Build Coastguard Worker 80*890232f2SAndroid Build Coastguard Worker var monster1 = Monster.EndMonster(builder); 81*890232f2SAndroid Build Coastguard Worker Monster.FinishMonsterBuffer(builder, monster1); 82*890232f2SAndroid Build Coastguard Worker } 83*890232f2SAndroid Build Coastguard Worker } 84*890232f2SAndroid Build Coastguard Worker 85*890232f2SAndroid Build Coastguard Worker [Benchmark] TestTables()86*890232f2SAndroid Build Coastguard Worker public void TestTables() 87*890232f2SAndroid Build Coastguard Worker { 88*890232f2SAndroid Build Coastguard Worker FlatBufferBuilder builder = new FlatBufferBuilder(1024 * 1024 * 32); 89*890232f2SAndroid Build Coastguard Worker for (int x = 0; x < 500000; ++x) 90*890232f2SAndroid Build Coastguard Worker { 91*890232f2SAndroid Build Coastguard Worker var offset = builder.CreateString("T"); 92*890232f2SAndroid Build Coastguard Worker builder.StartObject(4); 93*890232f2SAndroid Build Coastguard Worker builder.AddDouble(3.2); 94*890232f2SAndroid Build Coastguard Worker builder.AddDouble(4.2); 95*890232f2SAndroid Build Coastguard Worker builder.AddDouble(5.2); 96*890232f2SAndroid Build Coastguard Worker builder.AddOffset(offset.Value); 97*890232f2SAndroid Build Coastguard Worker builder.EndObject(); 98*890232f2SAndroid Build Coastguard Worker } 99*890232f2SAndroid Build Coastguard Worker } 100*890232f2SAndroid Build Coastguard Worker } 101*890232f2SAndroid Build Coastguard Worker } 102