.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】

推薦閱讀