Skip to content

Commit 923ed71

Browse files
authored
Merge pull request #10 from Odonno/feat/cbor
Create benchmark for CBOR format
2 parents e2bff47 + e5890cf commit 923ed71

7 files changed

Lines changed: 103 additions & 24 deletions

File tree

BinaryBenchmark.CBOR.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Dahomey.Cbor;
3+
using SerializationBenchmarks.Converters.Cbor;
4+
using SerializationBenchmarks.Models;
5+
6+
public partial class BinaryBenchmark
7+
{
8+
private static readonly CborOptions _options = new();
9+
10+
static BinaryBenchmark()
11+
{
12+
_options.Registry.ConverterRegistry.RegisterConverter(typeof(Guid), new GuidConverter());
13+
}
14+
15+
[Benchmark, BenchmarkCategory("Serialization", "Binary"), ArgumentsSource(nameof(GenerateDataSets))]
16+
public Task<byte[]> CBOR_Serialize(DataSet data)
17+
{
18+
return DataConvert_CBOR(data.Payload);
19+
}
20+
21+
[Benchmark, BenchmarkCategory("Deserialization", "Binary"), ArgumentsSource(nameof(GenerateDataSets))]
22+
public ValueTask<List<User>> CBOR_Deserialize(DataSet data)
23+
{
24+
using var ms = new MemoryStream(data.SerializedData.CBOR);
25+
return Cbor.DeserializeAsync<List<User>>(ms, _options);
26+
}
27+
28+
private async Task<byte[]> DataConvert_CBOR(List<User> users)
29+
{
30+
using var ms = new MemoryStream();
31+
await Cbor.SerializeAsync(users, ms, _options).ConfigureAwait(false);
32+
return ms.ToArray();
33+
}
34+
}

BinaryBenchmark.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ public IEnumerable<DataSet> GenerateDataSets()
2727
{
2828
var json = File.ReadAllText(set.File);
2929
var users = JsonSerializer.Deserialize<List<User>>(json, options);
30+
31+
var cborData = DataConvert_CBOR(users).GetAwaiter().GetResult();
32+
3033
yield return new DataSet
3134
{
3235
Name = set.Subset,
@@ -35,12 +38,13 @@ public IEnumerable<DataSet> GenerateDataSets()
3538
{
3639
AvroConvert = DataConvert_AvroConvert(users),
3740
BSON = DataConvert_BSON(users),
41+
CBOR = cborData,
3842
GroBuf = DataConvert_GroBuf(users),
3943
Hyperion = DataConvert_Hyperion(users),
4044
MessagePack = DataConvert_MessagePack(users),
4145
MemoryPack = DataConvert_MemoryPack(users),
4246
MsgPack = DataConvert_MsgPack(users),
43-
ProtoBufNet = DataConvert_ProtoBufNet(users)
47+
ProtoBufNet = DataConvert_ProtoBufNet(users),
4448
}
4549
};
4650
}
@@ -58,6 +62,7 @@ public class SerializedData
5862
{
5963
public byte[] AvroConvert { get; set; }
6064
public byte[] BSON { get; set; }
65+
public byte[] CBOR { get; set; }
6166
public byte[] GroBuf { get; set; }
6267
public byte[] Hyperion { get; set; }
6368
public byte[] MessagePack { get; set; }

Converters/Cbor/GuidConverter.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using Dahomey.Cbor;
2+
using Dahomey.Cbor.Serialization;
3+
using Dahomey.Cbor.Serialization.Converters;
4+
5+
namespace SerializationBenchmarks.Converters.Cbor;
6+
7+
internal sealed class GuidConverter : CborConverterBase<Guid>
8+
{
9+
private const int CBOR_ARRAY_SIZE = 16;
10+
private const ulong TAG_UUID = 37;
11+
12+
public override Guid Read(ref CborReader reader)
13+
{
14+
var value = reader.ReadByteString();
15+
16+
if (value.Length != CBOR_ARRAY_SIZE)
17+
{
18+
throw new CborException("Expected a CBOR byte array with 16 elements");
19+
}
20+
21+
return new Guid(value);
22+
}
23+
24+
public override void Write(ref CborWriter writer, Guid value)
25+
{
26+
writer.WriteSemanticTag(TAG_UUID);
27+
28+
Span<byte> bytes = new byte[CBOR_ARRAY_SIZE];
29+
if (value.TryWriteBytes(bytes))
30+
{
31+
writer.WriteByteString(bytes);
32+
}
33+
else
34+
{
35+
throw new CborException("Cannot serialize the GUID to CBOR");
36+
}
37+
}
38+
}
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@
44
//
55
//
66
// bebopc version:
7-
// 2.4.6
7+
// 3.0.14
88
//
99
//
1010
// bebopc source:
11-
// https://github.com/RainwayApp/bebop
11+
// https://github.com/betwixt-labs/bebop
1212
//
1313
//
1414
// Changes to this file may cause incorrect behavior and will be lost if
1515
// the code is regenerated.
1616
// </auto-generated>
1717
//
18-
// This source code was auto-generated by bebopc, Version=2.4.6.
18+
// This source code was auto-generated by bebopc, Version=3.0.14.
1919
//
2020
namespace SerializationBenchmarks.Models.Bebop {
2121

22-
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "2.4.6")]
22+
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "3.0.14")]
2323
[global::Bebop.Attributes.BebopRecord(global::Bebop.Runtime.BebopKind.Enum)]
2424
public enum Gender : uint {
2525
Male = 0,
2626
Female = 1
2727
}
2828

29-
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "2.4.6")]
29+
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "3.0.14")]
3030
[global::Bebop.Attributes.BebopRecord(global::Bebop.Runtime.BebopKind.Message)]
31-
public partial class Order : global::Bebop.Runtime.BaseBebopRecord, global::System.IEquatable<Order> {
31+
public partial class Order : global::Bebop.Runtime.BaseBebopRecord, global::Bebop.Runtime.IDecodable<Order>, global::System.IEquatable<Order> {
3232
#nullable enable
3333
/// <inheritdoc />
3434
public sealed override int MaxByteCount => GetMaxByteCount();
@@ -315,9 +315,9 @@ public override int GetHashCode() {
315315

316316
}
317317

318-
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "2.4.6")]
318+
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "3.0.14")]
319319
[global::Bebop.Attributes.BebopRecord(global::Bebop.Runtime.BebopKind.Message)]
320-
public partial class User : global::Bebop.Runtime.BaseBebopRecord, global::System.IEquatable<User> {
320+
public partial class User : global::Bebop.Runtime.BaseBebopRecord, global::Bebop.Runtime.IDecodable<User>, global::System.IEquatable<User> {
321321
#nullable enable
322322
/// <inheritdoc />
323323
public sealed override int MaxByteCount => GetMaxByteCount();
@@ -819,9 +819,9 @@ public override int GetHashCode() {
819819

820820
}
821821

822-
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "2.4.6")]
822+
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "3.0.14")]
823823
[global::Bebop.Attributes.BebopRecord(global::Bebop.Runtime.BebopKind.Message)]
824-
public partial class UserWrapper : global::Bebop.Runtime.BaseBebopRecord, global::System.IEquatable<UserWrapper> {
824+
public partial class UserWrapper : global::Bebop.Runtime.BaseBebopRecord, global::Bebop.Runtime.IDecodable<UserWrapper>, global::System.IEquatable<UserWrapper> {
825825
#nullable enable
826826
/// <inheritdoc />
827827
public sealed override int MaxByteCount => GetMaxByteCount();

Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Text.Json.Serialization;
44
using BenchmarkDotNet.Running;
55
using Bogus;
6-
using Microsoft.Diagnostics.Runtime;
76
using SerializationBenchmarks.Models;
87

98
internal static class Program
@@ -43,6 +42,7 @@ private static void VerifySerializedSizes()
4342
var results = binaryResults[bds.Name];
4443
results["AvroConvert"] = bds.SerializedData.AvroConvert.Length;
4544
results["BSON"] = bds.SerializedData.BSON.Length;
45+
results["CBOR"] = bds.SerializedData.CBOR.Length;
4646
results["GroBuf"] = bds.SerializedData.GroBuf.Length;
4747
results["Hyperion"] = bds.SerializedData.Hyperion.Length;
4848
results["MessagePack"] = bds.SerializedData.MessagePack.Length;

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ As part of a [YouTube video](https://www.youtube.com/watch?v=XMoNYQPi2k8), I wen
1818
- [AvroConvert](https://www.nuget.org/packages/AvroConvert/)
1919
- [Bebop](https://www.nuget.org/packages/bebop)
2020
- [BSON](https://www.nuget.org/packages/MongoDB.Bson)
21+
- [CBOR](https://www.nuget.org/packages/Dahomey.Cbor)
2122
- [GroBuf](https://www.nuget.org/packages/GroBuf)
2223
- [Hyperion](https://www.nuget.org/packages/Hyperion)
2324
- [MessagePack](https://www.nuget.org/packages/MessagePack)

SerializationBenchmarks.csproj

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net7.0</TargetFramework>
5+
<TargetFramework>net9.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>disable</Nullable>
88
<DefineConstants>$(DefineConstants);DATASET_SMALL;</DefineConstants>
@@ -11,25 +11,26 @@
1111
</PropertyGroup>
1212

1313
<ItemGroup>
14-
<PackageReference Include="AvroConvert" Version="3.4.6" />
15-
<PackageReference Include="bebop" Version="3.0.5" />
16-
<PackageReference Include="bebop-tools" Version="3.0.5">
14+
<PackageReference Include="AvroConvert" Version="3.4.10" />
15+
<PackageReference Include="bebop" Version="3.0.14" />
16+
<PackageReference Include="bebop-tools" Version="3.0.14">
1717
<PrivateAssets>all</PrivateAssets>
1818
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1919
</PackageReference>
20-
<PackageReference Include="BenchmarkDotNet" Version="0.13.12" />
21-
<PackageReference Include="Bogus" Version="35.5.0" />
20+
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
21+
<PackageReference Include="Bogus" Version="35.6.1" />
22+
<PackageReference Include="Dahomey.Cbor" Version="1.24.3" />
2223
<PackageReference Include="GroBuf" Version="1.9.2" />
2324
<PackageReference Include="Hyperion" Version="0.12.2" />
2425
<PackageReference Include="Jil" Version="2.17.0" />
25-
<PackageReference Include="MemoryPack" Version="1.20.2" />
26-
<PackageReference Include="MessagePack" Version="2.5.140" />
27-
<PackageReference Include="MongoDB.Bson" Version="2.24.0" />
26+
<PackageReference Include="MemoryPack" Version="1.21.3" />
27+
<PackageReference Include="MessagePack" Version="2.5.192" />
28+
<PackageReference Include="MongoDB.Bson" Version="2.30.0" />
2829
<PackageReference Include="MsgPack.Cli" Version="1.0.1" />
2930
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
30-
<PackageReference Include="protobuf-net" Version="3.2.30" />
31-
<PackageReference Include="ServiceStack.Text" Version="8.2.2" />
32-
<PackageReference Include="SpanJson" Version="4.0.1" />
31+
<PackageReference Include="protobuf-net" Version="3.2.45" />
32+
<PackageReference Include="ServiceStack.Text" Version="8.4.0" />
33+
<PackageReference Include="SpanJson" Version="4.2.1" />
3334
<PackageReference Include="Utf8Json" Version="1.3.7" />
3435
</ItemGroup>
3536

0 commit comments

Comments
 (0)