正文

MessagePack 和System.Text.Json 序列化和反序列化性能及对比分析(message in a bottle)快来看

文章摘要

这篇文章介绍了使用`MessagePack`和`JsonSerializer`对一组`TestModule`对象进行序列化和反序列化的过程,并通过几个基准测试来衡量这两种序列化方式的性能。代码中定义了一个带有注解的`SerializeTest`类,使用`MemoryDiagnoser`等注解对数据进行分析。在构造函数中,生成了3000个`TestModule`实例,并分别使用`MessagePack`和`Json`格式生成字节数组`Pack`和`Json`。此外,文章还展示了如何通过基准测试比较这两种序列化方式的速度和性能表现。

using BenchmarkDotNet.Attributes; using MessagePack; using System.Text.Json; namespace Demo { [MemoryDiagnoser, RankColumn, MaxColumn,MinColumn] public class SerializeTest { public List<TestModule> TestDatas=new(); public byte[] Pack; public byte[] Json; public SerializeTest() { for (int i=0; i < 3000; i++) { var d=new TestModule(Guid.NewGuid(), Guid.NewGuid().ToString(“N”) + i); d.i=i; TestDatas.Add(d); } Pack=MessagePackSerializer.Serialize(TestDatas, MessagePack.Resolvers.ContractlessStandardResolver.Options); Json=JsonSerializer.SerializeToUtf8Bytes(TestDatas); } [Benchmark] public byte[] GetMessagePackByte() { return MessagePackSerializer.Serialize(TestDatas, MessagePack.Resolvers.ContractlessStandardResolver.Options); } [Benchmark] public byte[] TextJsonByte() { return JsonSerializer.SerializeToUtf8Bytes(TestDatas); } [Benchmark] public List<TestModule> GetMessagePack() { return MessagePackSerializer.Deserialize<List<TestModule>>(Pack, MessagePack.Resolvers.ContractlessStandardResolver.Options); } [Benchmark] public List<TestModule>? TextJson() { return JsonSerializer.Deserialize<List<TestModule>>(Json); } public class TestModule { public TestModule(Guid id, string? value) { Id=id; Value=value; } public Guid Id { get; set; } public int i { get; set; } public string? Value { get; set; } public string MyProperty { get; set; }=”MyProperty”; public string MyProperty1 { get; set; }=”MyProperty”; public string MyProperty2 { get; set; }=”MyProperty”; public string MyProperty3 { get; set; }=”MyProperty”; public string MyProperty4 { get; set; }=”MyProperty”; public string MyProperty5 { get; set; }=”MyProperty”; public string MyProperty6 { get; set; }=”MyProperty”; public string MyProperty7 { get; set; }=”MyProperty”; public string MyProperty8 { get; set; }=”MyProperty”; public string MyProperty9 { get; set; }=”MyProperty”; public string MyProperty10 { get; set; }=”MyProperty”; } } }