.NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json( 二 )


反序列化测试在现实世界的应用中,你不仅要序列化,还要从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

.NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json

文章插图
就性能而言 , 微软仍然远远领先于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
.NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json

文章插图
在Microsofts框架下,速度又快了一倍,内存效率是惊人的7倍,比Newtonsoft还要好!
总结尽管Newtonsoft在他们的文档上说:
高性能:比.NET的内置JSON序列化器更快
很明显,至少从.NET 7开始 , Microsofts的System.Text.Json在所有测试的用例中至少快了一倍,命名为 。
  • 序列化一个大数据集
  • 序列化许多小数据集
  • 对一个大数据集进行反序列化
  • 对许多小数据集进行反序列化
所有这些都是在每个框架的默认序列化器设置下进行的 。
不仅速度快了100%,而且在某些情况下,分配的内存甚至比Newtonsoft的效率高5倍以上 。
我甚至认为,可以推断出结果,目前使用System.Text.JsonNewtonsoft.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】

推荐阅读