xref: /aosp_15_r20/external/flatbuffers/tests/FlatBuffers.Benchmarks/FlatBufferBuilderBenchmark.cs (revision 890232f25432b36107d06881e0a25aaa6b473652)
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