Skip to content

Commit 0c111c5

Browse files
committed
some wire formatting improvements
1 parent 830c747 commit 0c111c5

File tree

4 files changed

+366
-203
lines changed

4 files changed

+366
-203
lines changed

projects/Benchmarks/WireFormatting/DataTypeSerialization.cs

Lines changed: 111 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,83 @@ public class DataTypeSerialization
2121
public virtual void SetUp() { }
2222
}
2323

24-
public class DateTypeArraySerialization : DataTypeSerialization
24+
public class DataTypeFieldSerialization : DataTypeSerialization
2525
{
26-
readonly List<object> _emptyArray = new List<object>();
27-
Memory<byte> _emptyArrayBuffer;
28-
Memory<byte> _populatedArrayBuffer;
29-
List<object> _array;
26+
private readonly object _intObject = 5;
27+
private readonly string _shortString = new string('x', 100);
28+
private readonly byte[] _byteArray = new byte[0];
29+
private readonly Dictionary<string, object> _emptyDictionary = new Dictionary<string, object>();
30+
private readonly BinaryTableValue _binaryTableValue = new BinaryTableValue(new byte[0]);
31+
32+
private Memory<byte> _fieldStringBuffer;
33+
private Memory<byte> _fieldIntBuffer;
34+
private Memory<byte> _fieldNullBuffer;
35+
private Memory<byte> _fieldArrayBuffer;
36+
private Memory<byte> _fieldDictBuffer;
37+
private Memory<byte> _fieldBinaryTableValueBuffer;
38+
39+
public override void SetUp()
40+
{
41+
_fieldNullBuffer = new byte[WireFormatting.GetFieldValueByteCount(null)];
42+
WireFormatting.WriteFieldValue(_fieldNullBuffer.Span, null);
43+
_fieldIntBuffer = new byte[WireFormatting.GetFieldValueByteCount(_intObject)];
44+
WireFormatting.WriteFieldValue(_fieldIntBuffer.Span, _intObject);
45+
_fieldStringBuffer = new byte[WireFormatting.GetFieldValueByteCount(_shortString)];
46+
WireFormatting.WriteFieldValue(_fieldStringBuffer.Span, _shortString);
47+
_fieldArrayBuffer = new byte[WireFormatting.GetFieldValueByteCount(_byteArray)];
48+
WireFormatting.WriteFieldValue(_fieldArrayBuffer.Span, _byteArray);
49+
_fieldDictBuffer = new byte[WireFormatting.GetFieldValueByteCount(_emptyDictionary)];
50+
WireFormatting.WriteFieldValue(_fieldDictBuffer.Span, _emptyDictionary);
51+
_fieldBinaryTableValueBuffer = new byte[WireFormatting.GetFieldValueByteCount(_binaryTableValue)];
52+
WireFormatting.WriteFieldValue(_fieldBinaryTableValueBuffer.Span, _binaryTableValue);
53+
}
54+
55+
[Benchmark]
56+
public object NullRead() => WireFormatting.ReadFieldValue(_fieldNullBuffer.Span, out int _);
57+
[Benchmark]
58+
public object IntRead() => WireFormatting.ReadFieldValue(_fieldIntBuffer.Span, out int _);
59+
[Benchmark]
60+
public object StringRead() => WireFormatting.ReadFieldValue(_fieldStringBuffer.Span, out int _);
61+
[Benchmark]
62+
public object ArrayRead() => WireFormatting.ReadFieldValue(_fieldArrayBuffer.Span, out int _);
63+
[Benchmark]
64+
public object DictRead() => WireFormatting.ReadFieldValue(_fieldDictBuffer.Span, out int _);
65+
[Benchmark]
66+
public object BinaryTableValueRead() => WireFormatting.ReadFieldValue(_fieldBinaryTableValueBuffer.Span, out int _);
67+
68+
[Benchmark]
69+
public int NullWrite() => WireFormatting.WriteFieldValue(_buffer.Span,null);
70+
[Benchmark]
71+
public int IntWrite() => WireFormatting.WriteFieldValue(_buffer.Span, _intObject);
72+
[Benchmark]
73+
public int StringWrite() => WireFormatting.WriteFieldValue(_buffer.Span, _shortString);
74+
[Benchmark]
75+
public int ArrayWrite() => WireFormatting.WriteFieldValue(_buffer.Span, _byteArray);
76+
[Benchmark]
77+
public int DictWrite() => WireFormatting.WriteFieldValue(_buffer.Span, _emptyDictionary);
78+
[Benchmark]
79+
public int BinaryTableValueWrite() => WireFormatting.WriteFieldValue(_buffer.Span, _binaryTableValue);
80+
81+
[Benchmark]
82+
public int NullGetSize() => WireFormatting.GetFieldValueByteCount(null);
83+
[Benchmark]
84+
public int IntGetSize() => WireFormatting.GetFieldValueByteCount(_intObject);
85+
[Benchmark]
86+
public int StringGetSize() => WireFormatting.GetFieldValueByteCount(_shortString);
87+
[Benchmark]
88+
public int ArrayGetSize() => WireFormatting.GetFieldValueByteCount(_byteArray);
89+
[Benchmark]
90+
public int DictGetSize() => WireFormatting.GetFieldValueByteCount(_emptyDictionary);
91+
[Benchmark]
92+
public int BinaryTableValueGetSize() => WireFormatting.GetFieldValueByteCount(_binaryTableValue);
93+
}
94+
95+
public class DataTypeArraySerialization : DataTypeSerialization
96+
{
97+
private readonly List<object> _emptyArray = new List<object>();
98+
private Memory<byte> _emptyArrayBuffer;
99+
private Memory<byte> _populatedArrayBuffer;
100+
private List<object> _array;
30101

31102
public override void SetUp()
32103
{
@@ -49,14 +120,20 @@ public override void SetUp()
49120

50121
[Benchmark]
51122
public int ArrayWritePopulated() => WireFormatting.WriteArray(_buffer.Span, _array);
123+
124+
[Benchmark]
125+
public int ArrayGetSizeEmpty() => WireFormatting.GetArrayByteCount(_emptyArray);
126+
127+
[Benchmark]
128+
public int ArrayGetSizePopulated() => WireFormatting.GetArrayByteCount(_array);
52129
}
53130

54131
public class DataTypeTableSerialization : DataTypeSerialization
55132
{
56-
IDictionary<string, object> _emptyDict = new Dictionary<string, object>();
57-
IDictionary<string, object> _populatedDict;
58-
Memory<byte> _emptyDictionaryBuffer;
59-
Memory<byte> _populatedDictionaryBuffer;
133+
private IDictionary<string, object> _emptyDict = new Dictionary<string, object>();
134+
private IDictionary<string, object> _populatedDict;
135+
private Memory<byte> _emptyDictionaryBuffer;
136+
private Memory<byte> _populatedDictionaryBuffer;
60137

61138
public override void SetUp()
62139
{
@@ -67,7 +144,7 @@ public override void SetUp()
67144
{ "uint", 1234u },
68145
{ "decimal", 12.34m },
69146
{ "timestamp", _timestamp },
70-
{ "fieldtable", new Dictionary<string, object>(){ { "test", "test" } } },
147+
{ "fieldtable", new Dictionary<string, object>{ { "test", "test" } } },
71148
{ "fieldarray", new List<object> { "longstring", 1234, 12.34m, _timestamp } }
72149
};
73150

@@ -89,13 +166,19 @@ public override void SetUp()
89166

90167
[Benchmark]
91168
public int TableWritePopulated() => WireFormatting.WriteTable(_buffer.Span, _populatedDict);
169+
170+
[Benchmark]
171+
public int TableGetSizeEmpty() => WireFormatting.GetTableByteCount(_emptyDict);
172+
173+
[Benchmark]
174+
public int TableGetSizePopulated() => WireFormatting.GetTableByteCount(_populatedDict);
92175
}
93176

94177
public class DataTypeLongStringSerialization : DataTypeSerialization
95178
{
96-
readonly string _longString = new string('X', 4096);
97-
readonly Memory<byte> _emptyLongStringBuffer = GenerateLongStringBuffer(string.Empty);
98-
readonly Memory<byte> _populatedLongStringBuffer = GenerateLongStringBuffer(new string('X', 4096));
179+
private readonly string _longString = new string('X', 4096);
180+
private readonly Memory<byte> _emptyLongStringBuffer = GenerateLongStringBuffer(string.Empty);
181+
private readonly Memory<byte> _populatedLongStringBuffer = GenerateLongStringBuffer(new string('X', 4096));
99182

100183
[Benchmark]
101184
public int LongstrReadEmpty() => WireFormatting.ReadLongstr(_emptyLongStringBuffer.Span, out _);
@@ -109,6 +192,12 @@ public class DataTypeLongStringSerialization : DataTypeSerialization
109192
[Benchmark]
110193
public int LongstrWritePopulated() => WireFormatting.WriteLongstr(_buffer.Span, _longString);
111194

195+
[Benchmark]
196+
public int LongstrGetSizeEmpty() => WireFormatting.GetFieldValueByteCount(string.Empty);
197+
198+
[Benchmark]
199+
public int LongstrGetSizePopulated() => WireFormatting.GetFieldValueByteCount(_longString);
200+
112201
private static byte[] GenerateLongStringBuffer(string val)
113202
{
114203
byte[] _buffer = new byte[5 + Encoding.UTF8.GetByteCount(val)];
@@ -119,9 +208,9 @@ private static byte[] GenerateLongStringBuffer(string val)
119208

120209
public class DataTypeShortStringSerialization : DataTypeSerialization
121210
{
122-
readonly string _shortString = new string('X', 255);
123-
readonly Memory<byte> _emptyShortStringBuffer = GenerateStringBuffer(string.Empty);
124-
readonly Memory<byte> _populatedShortStringBuffer = GenerateStringBuffer(new string('X', 255));
211+
private readonly string _shortString = new string('X', 255);
212+
private readonly Memory<byte> _emptyShortStringBuffer = GenerateStringBuffer(string.Empty);
213+
private readonly Memory<byte> _populatedShortStringBuffer = GenerateStringBuffer(new string('X', 255));
125214

126215
[Benchmark]
127216
public int ShortstrReadEmpty() => WireFormatting.ReadShortstr(_emptyShortStringBuffer.Span, out _);
@@ -135,6 +224,12 @@ public class DataTypeShortStringSerialization : DataTypeSerialization
135224
[Benchmark]
136225
public int ShortstrWritePopulated() => WireFormatting.WriteShortstr(_buffer.Span, _shortString);
137226

227+
[Benchmark]
228+
public int ShortstrGetSizeEmpty() => WireFormatting.GetByteCount(string.Empty);
229+
230+
[Benchmark]
231+
public int ShortstrGetSizePopulated() => WireFormatting.GetByteCount(_shortString);
232+
138233
private static byte[] GenerateStringBuffer(string val)
139234
{
140235
byte[] _buffer = new byte[2 + Encoding.UTF8.GetByteCount(val)];

projects/Benchmarks/WireFormatting/MethodSerialization.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public class MethodBasicDeliver : MethodSerializationBase
3939

4040
[Benchmark]
4141
public int BasicDeliverWrite() => _basicDeliver.WriteArgumentsTo(_buffer.Span);
42+
43+
[Benchmark]
44+
public int BasicDeliverSize() => _basicDeliver.GetRequiredBufferSize();
4245
}
4346

4447
public class MethodChannelClose : MethodSerializationBase
@@ -64,5 +67,8 @@ public class MethodBasicProperties : MethodSerializationBase
6467

6568
[Benchmark]
6669
public int BasicPropertiesWrite() => _basicProperties.WritePropertiesTo(_buffer.Span);
70+
71+
[Benchmark]
72+
public int BasicDeliverSize() => _basicProperties.GetRequiredPayloadBufferSize();
6773
}
6874
}

projects/Benchmarks/WireFormatting/PrimitivesSerialization.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,25 @@ public class PrimitivesBase
1717
public virtual void Setup() { }
1818
}
1919

20+
public class PrimitivesBool : PrimitivesBase
21+
{
22+
public override void Setup() => WireFormatting.WriteBits(_buffer.Span, true, false, true, false, true);
23+
24+
[Benchmark]
25+
public int BoolRead2() => WireFormatting.ReadBits(_buffer.Span, out bool _, out bool _);
26+
27+
[Benchmark]
28+
public int BoolRead5() => WireFormatting.ReadBits(_buffer.Span, out bool _, out bool _, out bool _, out bool _, out bool _);
29+
30+
[Benchmark]
31+
[Arguments(true, false)]
32+
public int BoolWrite2(bool param1, bool param2) => WireFormatting.WriteBits(_buffer.Span, param1, param2);
33+
34+
[Benchmark]
35+
[Arguments(true, false)]
36+
public int BoolWrite5(bool param1, bool param2) => WireFormatting.WriteBits(_buffer.Span, param1, param2, param1, param2, param1);
37+
}
38+
2039
public class PrimitivesDecimal : PrimitivesBase
2140
{
2241
public override void Setup() => WireFormatting.WriteDecimal(_buffer.Span, 123.45m);
@@ -36,7 +55,8 @@ public class PrimitivesLong : PrimitivesBase
3655
public int LongRead() => WireFormatting.ReadLong(_buffer.Span, out _);
3756

3857
[Benchmark]
39-
public int LongWrite() => WireFormatting.WriteLong(_buffer.Span, 12345u);
58+
[Arguments(12345u)]
59+
public int LongWrite(uint value) => WireFormatting.WriteLong(_buffer.Span, value);
4060
}
4161

4262
public class PrimitivesLonglong : PrimitivesBase
@@ -47,7 +67,8 @@ public class PrimitivesLonglong : PrimitivesBase
4767
public int LonglongRead() => WireFormatting.ReadLonglong(_buffer.Span, out _);
4868

4969
[Benchmark]
50-
public int LonglongWrite() => WireFormatting.WriteLonglong(_buffer.Span, 12345ul);
70+
[Arguments(12345ul)]
71+
public int LonglongWrite(ulong value) => WireFormatting.WriteLonglong(_buffer.Span, value);
5172
}
5273

5374
public class PrimitivesShort : PrimitivesBase
@@ -58,7 +79,8 @@ public class PrimitivesShort : PrimitivesBase
5879
public int ShortRead() => WireFormatting.ReadShort(_buffer.Span, out _);
5980

6081
[Benchmark]
61-
public int ShortWrite() => WireFormatting.WriteShort(_buffer.Span, 12345);
82+
[Arguments(12345)]
83+
public int ShortWrite(ushort value) => WireFormatting.WriteShort(_buffer.Span, value);
6284
}
6385

6486
public class PrimitivesTimestamp : PrimitivesBase

0 commit comments

Comments
 (0)