Skip to content

Commit 7690fae

Browse files
MFrpurdyRob Purdy
andauthored
[C#] Added more string read/write methods to the DirectBuffer #729 (#845)
* [C#] Add more string reading/writing methods to DirectBuffer More, hopefully efficient, mechanisms to read and write strings to and from the DirectBuffer. * [C#] Reverted to .net45 * [C#] Reverted to .net45 * [C#] Updated Samples to use the new String methods * [C#] Fixed checkstyle * [C#] Cleaning * Added Modified Benchmarks\nBoth a modified version of the the CarBenchmark which encodes and decodes to/from string; and a version wich uses the new methods to encode and decode strings Co-authored-by: Rob Purdy <[email protected]>
1 parent 11cda3a commit 7690fae

File tree

7 files changed

+754
-25
lines changed

7 files changed

+754
-25
lines changed
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
using System.Text;
2+
using Baseline;
3+
using BenchmarkDotNet.Attributes;
4+
using BenchmarkDotNet.Diagnosers;
5+
using Org.SbeTool.Sbe.Dll;
6+
7+
namespace Org.SbeTool.Sbe.Benchmarks.Bench.Benchmarks
8+
{
9+
[MemoryDiagnoser]
10+
public class CarBenchmark_with_strings_new
11+
{
12+
13+
private readonly byte[] _eBuffer = new byte[1024];
14+
private readonly byte[] _dBuffer = new byte[1024];
15+
private DirectBuffer _encodeBuffer;
16+
private DirectBuffer _decodeBuffer;
17+
private readonly Car _car = new Car();
18+
private readonly MessageHeader _messageHeader = new MessageHeader();
19+
20+
[GlobalSetup]
21+
public void Setup()
22+
{
23+
_encodeBuffer = new DirectBuffer(_eBuffer);
24+
_decodeBuffer = new DirectBuffer(_dBuffer);
25+
Encode(_car, _decodeBuffer, 0);
26+
}
27+
28+
[Benchmark]
29+
public int Encode()
30+
{
31+
return Encode(_car, _encodeBuffer, 0);
32+
}
33+
34+
[Benchmark]
35+
public int Decode()
36+
{
37+
return Decode(_car, _decodeBuffer, 0);
38+
}
39+
40+
public int Encode(Car car, DirectBuffer directBuffer, int bufferOffset)
41+
{
42+
_car.WrapForEncodeAndApplyHeader(directBuffer, bufferOffset, _messageHeader);
43+
44+
const int srcOffset = 0;
45+
46+
car.SerialNumber = 1234;
47+
car.ModelYear = 2013;
48+
car.Available = BooleanType.T;
49+
car.Code = Baseline.Model.A;
50+
car.SetVehicleCode("CODE12");
51+
52+
for (int i = 0, size = Car.SomeNumbersLength; i < size; i++)
53+
{
54+
car.SetSomeNumbers(i, (uint)i);
55+
}
56+
57+
car.Extras = OptionalExtras.CruiseControl | OptionalExtras.SportsPack;
58+
car.Engine.Capacity = 2000;
59+
car.Engine.NumCylinders = 4;
60+
car.Engine.SetManufacturerCode("123");
61+
car.Engine.Efficiency = 35;
62+
car.Engine.BoosterEnabled = BooleanType.T;
63+
car.Engine.Booster.BoostType = BoostType.NITROUS;
64+
car.Engine.Booster.HorsePower = 200;
65+
66+
var fuelFigures = car.FuelFiguresCount(3);
67+
fuelFigures.Next();
68+
fuelFigures.Speed = 30;
69+
fuelFigures.Mpg = 35.9f;
70+
fuelFigures.SetUsageDescription("Urban Cycle");
71+
72+
fuelFigures.Next();
73+
fuelFigures.Speed = 55;
74+
fuelFigures.Mpg = 49.0f;
75+
fuelFigures.SetUsageDescription("Combined Cycle");
76+
77+
fuelFigures.Next();
78+
fuelFigures.Speed = 75;
79+
fuelFigures.Mpg = 40.0f;
80+
fuelFigures.SetUsageDescription("Highway Cycle");
81+
82+
Car.PerformanceFiguresGroup perfFigures = car.PerformanceFiguresCount(2);
83+
perfFigures.Next();
84+
perfFigures.OctaneRating = 95;
85+
86+
Car.PerformanceFiguresGroup.AccelerationGroup acceleration = perfFigures.AccelerationCount(3).Next();
87+
acceleration.Mph = 30;
88+
acceleration.Seconds = 4.0f;
89+
90+
acceleration.Next();
91+
acceleration.Mph = 60;
92+
acceleration.Seconds = 7.5f;
93+
94+
acceleration.Next();
95+
acceleration.Mph = 100;
96+
acceleration.Seconds = 12.2f;
97+
98+
perfFigures.Next();
99+
perfFigures.OctaneRating = 99;
100+
acceleration = perfFigures.AccelerationCount(3).Next();
101+
102+
acceleration.Mph = 30;
103+
acceleration.Seconds = 3.8f;
104+
105+
acceleration.Next();
106+
acceleration.Mph = 60;
107+
acceleration.Seconds = 7.1f;
108+
109+
acceleration.Next();
110+
acceleration.Mph = 100;
111+
acceleration.Seconds = 11.8f;
112+
113+
car.SetManufacturer("Honda");
114+
car.SetModel("Civic VTi");
115+
car.SetActivationCode("code");
116+
117+
return car.Size;
118+
}
119+
120+
private readonly byte[] _buffer = new byte[128];
121+
122+
public int Decode(Car car, DirectBuffer directBuffer, int bufferOffset)
123+
{
124+
_messageHeader.Wrap(directBuffer, bufferOffset, 0);
125+
126+
car.WrapForDecode(directBuffer, bufferOffset + MessageHeader.Size, _messageHeader.BlockLength, _messageHeader.Version);
127+
128+
var templateId = Car.TemplateId;
129+
var schemaVersion = Car.SchemaVersion;
130+
var serialNumber = car.SerialNumber;
131+
var modelYear = car.ModelYear;
132+
var available = car.Available;
133+
var code = car.Code;
134+
135+
for (int i = 0, size = Car.SomeNumbersLength; i < size; i++)
136+
{
137+
var number = car.GetSomeNumbers(i);
138+
}
139+
140+
var vehicleCode = car.GetVehicleCode();
141+
142+
OptionalExtras extras = car.Extras;
143+
var cruiseControl = (extras & OptionalExtras.CruiseControl) == OptionalExtras.CruiseControl;
144+
var sportsPack = (extras & OptionalExtras.SportsPack) == OptionalExtras.SportsPack;
145+
var sunRoof = (extras & OptionalExtras.SunRoof) == OptionalExtras.SunRoof;
146+
147+
Engine engine = car.Engine;
148+
var capacity = engine.Capacity;
149+
var numCylinders = engine.NumCylinders;
150+
var maxRpm = engine.MaxRpm;
151+
for (int i = 0, size = Engine.ManufacturerCodeLength; i < size; i++)
152+
{
153+
engine.GetManufacturerCode(i);
154+
}
155+
156+
var length = engine.GetFuel(_buffer, 0, _buffer.Length);
157+
158+
var efficiency = engine.Efficiency;
159+
var boosterEnabled = engine.BoosterEnabled;
160+
var boostType = engine.Booster.BoostType;
161+
var horsePower = engine.Booster.HorsePower;
162+
163+
var fuelFiguresGroup = car.FuelFigures;
164+
while (fuelFiguresGroup.HasNext)
165+
{
166+
var fuelFigures = fuelFiguresGroup.Next();
167+
var speed = fuelFigures.Speed;
168+
var mpg = fuelFigures.Mpg;
169+
var usage = fuelFigures.GetUsageDescription();
170+
}
171+
172+
var performanceFiguresGroup = car.PerformanceFigures;
173+
while (performanceFiguresGroup.HasNext)
174+
{
175+
performanceFiguresGroup.Next();
176+
var octanceRating = performanceFiguresGroup.OctaneRating;
177+
178+
var accelerationGroup = performanceFiguresGroup.Acceleration;
179+
for (int i = 0; i < accelerationGroup.Count; i++)
180+
{
181+
var acceleration = accelerationGroup.Next();
182+
var mpg = acceleration.Mph;
183+
var seconds = acceleration.Seconds;
184+
}
185+
}
186+
187+
var man = car.GetManufacturer();
188+
var model = car.GetModel();
189+
var actCode = car.GetActivationCode();
190+
return car.Size;
191+
}
192+
}
193+
}

0 commit comments

Comments
 (0)