MessagePack 和System.Text.Json 序列化和反序列化性能及对比分析

 更新时间:2023年01月23日 09:55:57   作者:token  
这篇文章主要介绍了MessagePack 和System.Text.Json 序列化和反序列化性能及对比分析,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下

本博客将测试MessagePack 和System.Text.Json 序列化和反序列化性能
项目文件:

Program.cs代码:

using BenchmarkDotNet.Running;
using Demo;

var summary = BenchmarkRunner.Run<SerializeTest>();

SerializeTest.cs代码:

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";

        }
    }
}

然后我们将使用基准测试开始我们的性能测试:

然后测试结束:

我们看到我们的MessagePack的性能在序列化Byte[]的表现对比TextJson上不光是性能比TextJson的更快,内存占用也更小
然后是反序列化对象 MessagePack对比TextJson 性能和内存占用都更强
在使用MessagePack的前提上我配置了MessagePack的配置 MessagePack.Resolvers.ContractlessStandardResolver.Options
如果不加 MessagePack.Resolvers.ContractlessStandardResolver.Options 性能可能并不比Json更快更好 启用了配置以后模型不需要添加特性 并且性能更快
在需要更快性能的场景MessagePack更适合 并且传输的体积更小,所以非常推荐在需要性能的场景下使用MessagePack

顺便我还测试过嵌套序列化和反序列化MessagePack的表现还是比Json的更强

到此这篇关于MessagePack 和System.Text.Json 序列化和反序列化性能及对比分析的文章就介绍到这了,更多相关MessagePack 和System.Text.Json 序列化和反序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • DataGridView展开与收缩功能实现

    DataGridView展开与收缩功能实现

    我们今天将要讲到DataGridView之行的展开与收缩,包括功能是如何实现的,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • 密码绑定至密码文本框中(TextMode设为Password)

    密码绑定至密码文本框中(TextMode设为Password)

    一般情况之下TextBox的TextMode设为Password话,我们想在后台(.cs)绑定一个值至此文本框,是无法实现的,如果一定要绑定值的话,该如何实现呢?,本文将告诉你实现方法,感兴趣的朋友可以参考下
    2013-01-01
  • 如何处理ASP.NET Core中HTML5客户端路由回退的问题

    如何处理ASP.NET Core中HTML5客户端路由回退的问题

    这篇文章主要给大家介绍了关于如何处理ASP.NET Core中HTML5客户端路由回退的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • IE10下Gridview后台设置行高不起作用解决方法

    IE10下Gridview后台设置行高不起作用解决方法

    GridView1.HeaderStyle.Height=17发现在IE10 中不起作用,经过反复测试修改为e.Row.Cells[0].Height=17即可解决问题,有类似问题的朋友可以参考下哈
    2013-04-04
  • 剖析Asp.Net Web API路由系统---WebHost部署方式

    剖析Asp.Net Web API路由系统---WebHost部署方式

    这篇文章主要介绍了剖析Asp.Net Web API路由系统---WebHost部署方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • Asp.net core利用IIS在windows上进行托管步骤详解

    Asp.net core利用IIS在windows上进行托管步骤详解

    这篇文章主要给大家介绍了关于Asp.net core利用IIS在windows上进行托管步骤的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • .net下Quartz.Net的使用方法

    .net下Quartz.Net的使用方法

    这篇文章主要为大家详细介绍了.net下Quartz.Net的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C# 数组查找与排序实现代码

    C# 数组查找与排序实现代码

    数组查找对象的方法一种是查找对象,一种是查找值
    2009-10-10
  • asp.net XML文件操作实现代码

    asp.net XML文件操作实现代码

    这几天在项目中用到了XML文件配置存储一些基本信息,如:参数、表格等一些信息存储。由于记录不是很多,所以用此文件来代替数据库中设计的表结构。
    2009-12-12
  • Linux(Ubuntu)下搭建ASP.NET Core环境

    Linux(Ubuntu)下搭建ASP.NET Core环境

    本文给大家介绍的是无需安装mono,在Linux(Ubuntu14.04.4 LTS)下搭建ASP.NET Core环境 继续.NET跨平台,希望对大家能够有所帮助。
    2016-07-07

最新评论