反序列化测试在现实世界的应用中,你不仅要序列化,还要从JSON序列化的字符串中反序列化对象 。在下面的基准中 , 我们将再次使用Bogus,创建一组用户,但这次我们要把它们序列化为一个大的字符串,用于大数据对象 , 并把许多小数据对象序列化为List<string>
。
private string serializedTestUsers;private List<string> serializedTestUsersList = new();[GlobalSetup]public void GlobalSetup(){var faker = new Faker<User>().CustomInstantiator(f => new User(Guid.NewGuid(),f.Name.FirstName(),f.Name.LastName(),f.Name.FullName(),f.Internet.UserName(f.Name.FirstName(), f.Name.LastName()),f.Internet.Email(f.Name.FirstName(), f.Name.LastName())));var testUsers = faker.Generate(Count);serializedTestUsers = JsonSerializer.Serialize(testUsers);foreach (var user in testUsers.Select(u => JsonSerializer.Serialize(u))){serializedTestUsersList.Add(user);}}
反序列化大对象第一个反序列化基准将一个大的JSON字符串反序列化为相应的.NET对象 。在这种情况下,它又是List<User>
, 我们在前面的例子中也使用了它 。
[Benchmark(Baseline = true)]public void NewtonsoftDeserializeBigData() =>_ = Newtonsoft.Json.JsonConvert.DeserializeObject<List<User>>(serializedTestUsers);[Benchmark]public void MicrosoftDeserializeBigData() =>_ = System.Text.Json.JsonSerializer.Deserialize<List<User>>(serializedTestUsers);
在我的机器上运行这些基准测试 , 得出以下结果:
MethodCountMeanRatioAllocatedAlloc RatioNewtonsoftDeserializeBigData1000021.20 ms1.0010.55 MB1.00MicrosoftDeserializeBigData1000012.12 ms0.576.17 MB0.59
文章插图
就性能而言 , 微软仍然远远领先于Newtonsoft 。然而 , 我们可以看到,Newtonsoft并没有慢一半 , 而是慢了40%左右,这在与序列化基准的直接比较中是一个进步 。
反序列化许多小对象本章的最后一个基准是许多小对象的反序列化 。在这里,我们使用我们在上面的
GlobalSetup()
方法中初始化的List<string>
,在一个循环中反序列化数据对象:[Benchmark(Baseline = true)]public void NewtonsoftDeserializeMuchData(){foreach (var user in serializedTestUsersList){_ = Newtonsoft.Json.JsonConvert.DeserializeObject<User>(user);}}[Benchmark]public void MicrosoftDeserializeMuchData(){foreach (var user in serializedTestUsersList){_ = System.Text.Json.JsonSerializer.Deserialize<User>(user);}}
其结果甚至比相关的序列化基准更令人吃惊:MethodCountMeanRatioAllocatedAlloc RatioNewtonsoftDeserializeMuchData1000015.577 ms1.0035.54 MB1.00MicrosoftDeserializeMuchData100007.916 ms0.514.8 MB0.14
文章插图
在Microsofts框架下,速度又快了一倍,内存效率是惊人的7倍,比Newtonsoft还要好!
总结尽管Newtonsoft在他们的文档上说:
高性能:比.NET的内置JSON序列化器更快很明显,至少从.NET 7开始 , Microsofts的
System.Text.Json
在所有测试的用例中至少快了一倍,命名为 。- 序列化一个大数据集
- 序列化许多小数据集
- 对一个大数据集进行反序列化
- 对许多小数据集进行反序列化
不仅速度快了100%,而且在某些情况下,分配的内存甚至比Newtonsoft的效率高5倍以上 。
我甚至认为,可以推断出结果,目前使用
System.Text.Json
比Newtonsoft.Json
更快 。请记住,这些结果只对最新的.NET 7有效 。如果你使用的是其他版本的.NET , 情况可能正好相反,Newtonsoft可能会更快 。
我希望 , 我的文章可以帮助你对序列化器做出选择选择,并让你对性能和基准测试的世界有一个有趣的切入点 。
如果你喜欢这个系列的文章 , 请一定要关注我,因为还有很多有趣的话题等着你 。
谢谢你的阅读!
版权原文版权:Tobias Streng翻译版权:InCerry原文链接:https://medium.com/@tobias.streng/net-performance-series-2-newtonsoft-vs-system-text-json-2bf43e037db0
【.NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json】
推荐阅读
- 某 .NET RabbitMQ SDK 有采集行为,你怎么看?
- 五 Selenium4+Python3系列 - 多窗口处理之句柄切换
- .net core Blazor+自定义日志提供器实现实时日志查看器
- 学习ASP.NET Core Blazor编程系列九——服务器端校验
- 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践
- 重新整理 .net core 实践篇 ———— linux上排查问题 [外篇]
- iQOO8Pro续航能力怎么样_iQOO8Pro续航实测
- .NET API 接口数据传输加密最佳实践
- 重新整理 .net core 实践篇 ———— linux 上线篇 [外篇]
- .Net Core&RabbitMQ限制循环消费