Skip to content

Commit d5720c1

Browse files
committed
remove json serialization benchmark
1 parent 46ba9bd commit d5720c1

File tree

8 files changed

+90
-85
lines changed

8 files changed

+90
-85
lines changed

benchmarks/Backdash.Benchmarks/Cases/SerializationBenchmark.cs

Lines changed: 45 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
using System.Buffers;
66
using System.Diagnostics;
77
using System.Runtime.InteropServices;
8-
using System.Text.Json;
9-
using System.Text.Json.Serialization;
108
using Backdash.Core;
119
using Backdash.Data;
1210
using Backdash.Network;
@@ -15,65 +13,36 @@
1513

1614
namespace Backdash.Benchmarks.Cases;
1715

18-
[RPlotExporter]
19-
[InProcess, MemoryDiagnoser, RankColumn]
16+
[InProcess, MemoryDiagnoser]
17+
[RPlotExporter, RankColumn]
2018
public class SerializationBenchmark
2119
{
2220
TestData data = null!;
2321
TestData result = null!;
2422

2523
readonly ArrayBufferWriter<byte> buffer = new((int)ByteSize.FromMebiBytes(10).ByteCount);
2624

27-
Utf8JsonWriter jsonWriter = null!;
28-
29-
readonly JsonSerializerOptions jsonOptions = new()
30-
{
31-
PreferredObjectCreationHandling = JsonObjectCreationHandling.Populate,
32-
WriteIndented = false,
33-
IncludeFields = true,
34-
};
35-
36-
static TestData NewTestData(Random random)
37-
{
38-
TestData testData = new()
39-
{
40-
Field1 = random.NextBool(),
41-
Field2 = random.Next<ulong>(),
42-
};
43-
44-
for (int i = 0; i < testData.Field3.Length; i++)
45-
{
46-
ref var entry = ref testData.Field3[i];
47-
entry.Field1 = random.Next();
48-
entry.Field2 = random.Next<uint>();
49-
entry.Field3 = random.Next<ulong>();
50-
entry.Field4 = random.Next<long>();
51-
entry.Field5 = random.Next<short>();
52-
entry.Field6 = random.Next<ushort>();
53-
entry.Field7 = random.Next<byte>();
54-
entry.Field8 = random.Next<sbyte>();
55-
random.Next(entry.Field9.AsSpan());
56-
}
57-
58-
return testData;
59-
}
60-
6125
[GlobalSetup]
6226
public void Setup()
6327
{
6428
Random random = new(42);
65-
data = NewTestData(random);
66-
jsonWriter = new(buffer);
29+
data = TestData.Generate(random);
6730
}
6831

6932
[IterationSetup]
7033
public void BeforeEach()
7134
{
7235
buffer.Clear();
73-
jsonWriter.Reset();
7436
result = new();
7537
}
7638

39+
[IterationCleanup]
40+
public void AfterEach()
41+
{
42+
var size = ByteSize.FromBytes(buffer.WrittenCount);
43+
Console.WriteLine($"Data Size: {size} ({size.ByteCount} bytes)");
44+
}
45+
7746
[Benchmark]
7847
public void Backdash()
7948
{
@@ -86,19 +55,21 @@ public void Backdash()
8655
}
8756

8857
[Benchmark]
89-
public void MemoryPack()
58+
public void Backdash_BigEndian()
9059
{
91-
MemoryPackSerializer.Serialize(buffer, data);
92-
MemoryPackSerializer.Deserialize(buffer.WrittenSpan, ref result!);
60+
var writer = new BinaryBufferWriter(buffer, Endianness.BigEndian);
61+
writer.Write(data);
62+
int offset = 0;
63+
var reader = new BinaryBufferReader(buffer.WrittenSpan, ref offset, Endianness.BigEndian);
64+
reader.Read(result);
9365
Debug.Assert(data == result);
9466
}
9567

9668
[Benchmark]
97-
public void SystemJson()
69+
public void MemoryPack()
9870
{
99-
JsonSerializer.Serialize(jsonWriter, data, jsonOptions);
100-
Utf8JsonReader reader = new(buffer.WrittenSpan);
101-
result = JsonSerializer.Deserialize<TestData>(ref reader, jsonOptions)!;
71+
MemoryPackSerializer.Serialize(buffer, data);
72+
MemoryPackSerializer.Deserialize(buffer.WrittenSpan, ref result!);
10273
Debug.Assert(data == result);
10374
}
10475
}
@@ -112,7 +83,7 @@ public sealed partial class TestData : IBinarySerializable, IEquatable<TestData>
11283

11384
public TestData()
11485
{
115-
Field3 = new TestEntryData[1_000];
86+
Field3 = new TestEntryData[20_000];
11687
for (var i = 0; i < Field3.Length; i++)
11788
Field3[i].Field9 = new int[10_000];
11889
}
@@ -148,6 +119,31 @@ public static bool Equals(TestData? left, TestData? right)
148119

149120
public static bool operator ==(TestData? left, TestData? right) => Equals(left, right);
150121
public static bool operator !=(TestData? left, TestData? right) => !Equals(left, right);
122+
123+
public static TestData Generate(Random random)
124+
{
125+
TestData testData = new()
126+
{
127+
Field1 = random.NextBool(),
128+
Field2 = random.Next<ulong>(),
129+
};
130+
131+
for (int i = 0; i < testData.Field3.Length; i++)
132+
{
133+
ref var entry = ref testData.Field3[i];
134+
entry.Field1 = random.Next();
135+
entry.Field2 = random.Next<uint>();
136+
entry.Field3 = random.Next<ulong>();
137+
entry.Field4 = random.Next<long>();
138+
entry.Field5 = random.Next<short>();
139+
entry.Field6 = random.Next<ushort>();
140+
entry.Field7 = random.Next<byte>();
141+
entry.Field8 = random.Next<sbyte>();
142+
random.Next(entry.Field9.AsSpan());
143+
}
144+
145+
return testData;
146+
}
151147
}
152148

153149
[MemoryPackable]

benchmarks/Backdash.Benchmarks/Program.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,4 @@
88
switcher.Run(args);
99
#endif
1010

11-
// BenchmarkRunner.Run<GetBitStringBenchmark>();
12-
// BenchmarkRunner.Run<UdpClientBenchmark>();
1311
// await new UdpClientBenchmark().Start(10, false).ConfigureAwait(false);

src/Backdash/Core/Mem.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -138,33 +138,33 @@ public static int PopCount<T>(in ReadOnlySpan<T> values) where T : unmanaged
138138
switch (remaining.Length)
139139
{
140140
case >= sizeof(ulong):
141-
{
142-
var value = MemoryMarshal.Read<ulong>(remaining[..sizeof(ulong)]);
143-
index += sizeof(ulong);
144-
count += BitOperations.PopCount(value);
145-
continue;
146-
}
141+
{
142+
var value = MemoryMarshal.Read<ulong>(remaining[..sizeof(ulong)]);
143+
index += sizeof(ulong);
144+
count += BitOperations.PopCount(value);
145+
continue;
146+
}
147147
case >= sizeof(uint):
148-
{
149-
var value = MemoryMarshal.Read<uint>(remaining[..sizeof(uint)]);
150-
index += sizeof(uint);
151-
count += BitOperations.PopCount(value);
152-
continue;
153-
}
148+
{
149+
var value = MemoryMarshal.Read<uint>(remaining[..sizeof(uint)]);
150+
index += sizeof(uint);
151+
count += BitOperations.PopCount(value);
152+
continue;
153+
}
154154
case >= sizeof(ushort):
155-
{
156-
var value = MemoryMarshal.Read<ushort>(remaining[..sizeof(ushort)]);
157-
index += sizeof(ushort);
158-
count += ushort.PopCount(value);
159-
continue;
160-
}
155+
{
156+
var value = MemoryMarshal.Read<ushort>(remaining[..sizeof(ushort)]);
157+
index += sizeof(ushort);
158+
count += ushort.PopCount(value);
159+
continue;
160+
}
161161
case >= sizeof(byte):
162-
{
163-
var value = remaining[0];
164-
index += sizeof(byte);
165-
count += byte.PopCount(value);
166-
break;
167-
}
162+
{
163+
var value = remaining[0];
164+
index += sizeof(byte);
165+
count += byte.PopCount(value);
166+
break;
167+
}
168168
}
169169
}
170170

src/Backdash/Serialization/BinaryBufferReader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ public readonly ref struct BinaryBufferReader
2222
/// <param name="buffer">Byte buffer to be read</param>
2323
/// <param name="offset">Read offset reference</param>
2424
/// <param name="endianness">Deserialization endianness</param>
25-
public BinaryBufferReader(ReadOnlySpan<byte> buffer, ref int offset, Endianness endianness = Endianness.BigEndian)
25+
public BinaryBufferReader(ReadOnlySpan<byte> buffer, ref int offset, Endianness? endianness = null)
2626
{
2727
this.offset = ref offset;
2828
this.buffer = buffer;
29-
Endianness = endianness;
29+
Endianness = endianness ?? Platform.Endianness;
3030
}
3131

3232
readonly ref int offset;

src/Backdash/Serialization/BinaryBufferWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ namespace Backdash.Serialization;
2020
/// <param name="buffer">Byte buffer to be written</param>
2121
/// <param name="endianness">Serialization endianness</param>
2222
[DebuggerDisplay("Written: {WrittenCount}")]
23-
public readonly struct BinaryBufferWriter(ArrayBufferWriter<byte> buffer, Endianness endianness = Endianness.BigEndian)
23+
public readonly struct BinaryBufferWriter(ArrayBufferWriter<byte> buffer, Endianness? endianness = null)
2424
{
2525
/// <summary>
2626
/// Gets or init the value to define which endianness should be used for serialization.
2727
/// </summary>
28-
public readonly Endianness Endianness = endianness;
28+
public readonly Endianness Endianness = endianness ?? Platform.Endianness;
2929

3030
/// <summary>
3131
/// Backing IBufferWriter <see cref="IBufferWriter{T}"/>

src/Backdash/Serialization/BinaryRawBufferWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ public readonly ref struct BinaryRawBufferWriter
2424
public BinaryRawBufferWriter(
2525
scoped in Span<byte> buffer,
2626
ref int offset,
27-
Endianness endianness = Endianness.BigEndian
27+
Endianness? endianness = null
2828
)
2929
{
3030
this.buffer = buffer;
3131
this.offset = ref offset;
32-
Endianness = endianness;
32+
Endianness = endianness ?? Platform.Endianness;
3333
}
3434

3535
readonly ref int offset;

tests/Backdash.Tests/TestUtils/Assertions/AssertSerialization.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Backdash.Network;
12
using Backdash.Serialization;
23
using Backdash.Tests.TestUtils.Fixtures;
34

@@ -10,9 +11,18 @@ static class AssertSerialization
1011
public delegate void DeserializeFn<T>(ref T value, BinaryBufferReader reader);
1112

1213
public static bool Validate<T>(ref T value, SerializeFn<T> serialize, DeserializeFn<T> deserialize)
14+
where T : struct, IEquatable<T> =>
15+
Validate(ref value, Endianness.LittleEndian, serialize, deserialize)
16+
&&
17+
Validate(ref value, Endianness.BigEndian, serialize, deserialize);
18+
19+
public static bool Validate<T>(
20+
ref T value, Endianness endianness, SerializeFn<T> serialize,
21+
DeserializeFn<T> deserialize
22+
)
1323
where T : struct, IEquatable<T>
1424
{
15-
using BinarySerializerFixture fixture = new();
25+
using BinarySerializerFixture fixture = new(endianness);
1626

1727
serialize(ref value, fixture.Writer);
1828
T result = new();

tests/Backdash.Tests/TestUtils/Fixtures/BinarySerializerFixture.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Buffers;
22
using Backdash.Core;
3+
using Backdash.Network;
34
using Backdash.Serialization;
45

56
namespace Backdash.Tests.TestUtils.Fixtures;
@@ -15,13 +16,13 @@ readonly ref struct BinarySerializerFixture
1516
// ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
1617
readonly Offset offset = new();
1718

18-
public BinarySerializerFixture()
19+
public BinarySerializerFixture(Endianness? endianness = null)
1920
{
2021
ReadOffset = ref offset.Read;
2122
WriteOffset = ref offset.Write;
2223
buffer = ArrayPool<byte>.Shared.Rent(Max.UdpPacketSize);
23-
Reader = new(buffer, ref ReadOffset);
24-
Writer = new(buffer, ref WriteOffset);
24+
Reader = new(buffer, ref ReadOffset, endianness);
25+
Writer = new(buffer, ref WriteOffset, endianness);
2526
}
2627

2728
public void Dispose() => ArrayPool<byte>.Shared.Return(buffer, true);

0 commit comments

Comments
 (0)