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

微軟終于追上了?

7523af1d1b01bca292e0627bcbe1fef4.jpeg

圖片來自 Glenn Carstens-Peters[1]Unsplash[2]

歡迎來到.NET 性能系列的另一章。這個系列的特點是對.NET 世界中許多不同的主題進行研究、基準和比較。正如標題所說的那樣,重點在于使用最新的.NET7 的性能。你將看到哪種方法是實現特定主題的最快方法,以及大量的技巧和竅門,你如何能以較低的努力最大化你的代碼性能。如果你對這些主題感興趣,請繼續關注

在這篇文章中,我們將比較兩個最突出的.NET 的 json 框架。:Newtonsofts Json.NET[3] 和 Microsofts System.Text.Json[4].

Newtonsoft.Json是 NuGet 上下載量最大的軟件包,下載量超過23 億System.Text.Json稍稍落后,大約有6 億次下載。然而,我們需要考慮的是,System.Text.Json自.NET Core 3.1 起就默認隨.NET SDK 交付。既然如此,Newtonsoft 似乎仍然是最受歡迎的 json 框架。讓我們來看看,它是否能保持它的名次,或者微軟是否在性能方面緩慢但肯定地領先。

測試方案

為了模擬現實生活中應用的真實場景,我們將測試兩個主要用例。

  • 第一,單個大數據集的序列化和反序列化。

  • 第二是許多小數據集的序列化和反序列化。

一個真實的場景也需要真實的數據。對于測試數據集,我決定使用 NuGet 包Bogus[5]。通過 Bogus,我能夠快速生成許多不同的用戶,包括個人姓名、電子郵件、ID 等。

[Params(10000)]
public?int?Count?{?get;?set;?}private?List<User>?testUsers;[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())));testUsers?=?faker.Generate(Count);
}

對于基準,我們將使用每個軟件包的最新版本,目前是(2022 年 10 月):

  • Newtonsoft.Json — 13.0.1 and

  • System.Text.Json — 7.0.0-rc.2[6]

序列化測試

序列化大對象

為了測試一個大對象的序列化,我們簡單地使用List<User>,我們在GlobalSetup()方法中設置了它。我們的基準方法看起來像這樣:

[Benchmark(Baseline?=?true)]
public?void?NewtonsoftSerializeBigData()?=>_?=?Newtonsoft.Json.JsonConvert.SerializeObject(testUsers);[Benchmark]
public?void?MicrosoftSerializeBigData()?=>_?=?System.Text.Json.JsonSerializer.Serialize(testUsers);

這些方法都使用默認的ContractResolver,它只被實例化一次,因此是兩個框架中性能最好的序列化選項。如果你使用自定義的JsonSerializerSettings,注意不要多次實例化ContractResolver,否則你會降低很多性能。

現在我們來看看結果:

MethodCountMeanRatioAllocatedAlloc Ratio
NewtonsoftSerializeBigData100007.609 ms1.008.09 MB1.00
MicrosoftSerializeBigData100003.712 ms0.493.42 MB0.42
9fe0674c658e42905e7af106b0830481.png

盡管 Newtonsoft 在他們的第一個文檔網站[7]上說。

高性能:比.NET 的內置 JSON 序列化器快

我們可以清楚地看到,到目前為止,他們并不比內置的 JSON 序列化器快。至少在這個用例中是這樣。讓我們來看看,在其他使用情況下是否也是如此。

序列化許多小對象

這個用例在實際應用中比較常見,例如在 REST-Apis 中,每個網絡請求都必須處理 JSON 序列化數據,并且也要用 JSON 序列化數據進行響應。

為了實現這個用例,我們使用之前建立的List<User>,并簡單地循環通過它,同時單獨序列化每個用戶。

[Benchmark(Baseline?=?true)]
public?void?NewtonsoftSerializeMuchData()
{foreach?(var?user?in?testUsers){_?=?Newtonsoft.Json.JsonConvert.SerializeObject(user);}
}[Benchmark]
public?void?MicrosoftSerializeMuchData()
{foreach?(var?user?in?testUsers){_?=?System.Text.Json.JsonSerializer.Serialize(user);}
}

在我的機器上,這個基準測試導致了以下結果:

MethodCountMeanRatioAllocatedAlloc Ratio
NewtonsoftSerializeMuchData100008.087 ms1.0017.14 MB1.00
MicrosoftSerializeMuchData100003.944 ms0.493.64 MB0.21
4befa293ede13f468f8d39ff2fddfe47.png

我們可以看到對于許多小對象來說,性能又快了近 100%。不僅 System.Text.Json 的性能比 Newtonsoft 快了一倍,而且堆分配的內存甚至少了 5 倍! 正如我在以前的文章中提到的,節省堆內存甚至比速度更重要,你在這里看到了。堆內存最終將不得不被垃圾回收,這將阻塞你的整個應用程序的執行。

反序列化測試

在現實世界的應用中,你不僅要序列化,還要從 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 Ratio
NewtonsoftDeserializeBigData1000021.20 ms1.0010.55 MB1.00
MicrosoftDeserializeBigData1000012.12 ms0.576.17 MB0.59
b4bfb30e30af705e7b1b154f1babd374.png

就性能而言,微軟仍然遠遠領先于 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 Ratio
NewtonsoftDeserializeMuchData1000015.577 ms1.0035.54 MB1.00
MicrosoftDeserializeMuchData100007.916 ms0.514.8 MB0.14
770220a0ae437388b118652907db3598.png

在 Microsofts 框架下,速度又快了一倍,內存效率是驚人的7倍,比 Newtonsoft 還要好!

總結

盡管 Newtonsoft 在他們的文檔[8]上說:

高性能:比.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

參考資料

[1]

Glenn Carstens-Peters: https://unsplash.com/@glenncarstenspeters?utm_source=medium&utm_medium=referral

[2]

Unsplash: https://unsplash.com/?utm_source=medium&utm_medium=referral

[3]

Newtonsofts Json.NET: https://www.newtonsoft.com/json

[4]

Microsofts System.Text.Json: https://www.nuget.org/packages/System.Text.Json

[5]

Bogus: https://github.com/bchavez/Bogus

[6]

7.0.0-rc.2: https://www.nuget.org/packages/System.Text.Json/7.0.0-rc.2.22472.3

[7]

第一個文檔網站: https://www.newtonsoft.com/json/help/html/Introduction.htm

[8]

文檔: https://www.newtonsoft.com/json/help/html/Introduction.htm

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281512.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android gpu平板 推薦,性能強的不像話,最強安卓平板華為平板M6上手

原標題&#xff1a;性能強的不像話&#xff0c;最強安卓平板華為平板M6上手你為什么買平板電腦&#xff1f;當這一問題問出以后&#xff0c;許多朋友的表情都很微妙&#xff0c;隨后大概率的回答則相當統一&#xff1a;"我買平板干嘛&#xff1f;"。其實得到這樣一個…

【Python】HackBack(獲取暴力破解服務器密碼的IP來源)

1、前言 又在0x00sec上翻到好東東。 https://0x00sec.org/t/python-hackback-updated/882 帖子里的腳本會得到那些暴力服務器密碼失敗的IP和用戶名&#xff0c;并且使用shodan api做一個溯源定位。 #!/usr/bin/python3.4 import re import urllib.request import json log_path…

企業應用“數據優先”革命的下一個主戰場:安全與運營

根據IDC發布的2015年全球CIO日程預測&#xff0c;80%的CIO將提供一個實現創新和改善業務決策的新體系架構。 大數據時代&#xff0c;企業軟件市場正在經歷一次大遷移&#xff0c;數以十億計的企業IT支出預算將投向“數據優先”應用&#xff0c;而不是長久以來以業務流程和工作流…

給Web開發人員的以太坊入坑指南

以太坊現在各種學習資料數不勝數&#xff0c;但由于以太坊正處于飛速發展階段&#xff0c;有些學習資料很快就過時了。所以想找到有價值的資料無異于大海撈針。我費了很大功夫&#xff0c;才建立起對以太坊的整體認識&#xff0c;搞清楚它的工作機制。我相信很多躍躍欲試的開發…

和碩看重物聯網大勢 程建中:從擅長領域出發

物聯網(IoT)前景可期已是全球科技產業的共識&#xff0c;但是如何真正找出到位的商機&#xff0c;卻考驗產業鏈業者的智能。蘋果iPhone代工廠和碩聯合科技執行長程建中表示&#xff0c;物聯網與大數據相關應用商機看俏&#xff0c;物聯網筑的夢比網際網路還大&#xff0c;當年網…

html選擇文本框后提示消失,兩種方法實現文本框輸入內容提示消失

第一種方法&#xff1a;基于HTML5 input標簽的新特性 - placeholder 。另外&#xff0c;x-webkit-speech 屬性可以實現語音輸入功能。第二種方法&#xff1a;用span模擬&#xff0c;定位span&#xff0c;借助JS鍵盤事件判斷輸入&#xff0c;確定span里的內容顯示隱藏。無標題文…

TensorFlow基本計算單元——變量

# -*- coding: utf-8 -*- import tensorflow as tf a 3 # 創建變量 w tf.Variable([[0.5, 1.0]]) #行向量 x tf.Variable([[2.0], [1.0]]) y tf.matmul(w, x) #矩陣相乘 print(y) # Tensor("MatMul:0", shape(1, 1), dtypefloat32)init_op tf.global_variables…

程序人生:織夢dedecms后臺/會員驗證碼關閉

dedecms默認是所有的功能幾乎只要用到驗證碼的地方我們都需要驗證的&#xff0c;如果要關閉一些驗證功能我們可以參考下面的教程&#xff0c;這里介紹了關閉后臺&#xff0c;留言板&#xff0c;會員系統等驗證碼功能關閉了。提示&#xff1a;支持DedeCMS V5.6 以上的所有版本取…

html中圖片的屬性優化,Html標簽元素在SEO中的優化方式(二)

接上html標簽元素在SEO中的優化方式(一)中對HTML界面的介紹&#xff0c;我們今天繼續補充HTML標簽的SEO優化方式在內容中有幾個值得去研究一下的優化元素--導航和內部鏈接&#xff1a;很明顯的一點&#xff0c;建立導航會使搜索引擎可以容易的確定網站結構&#xff0c;但是很多…

Gartner認為安全性將取代成本和敏捷性成為政府部門采用云服務的首要原因

全球領先的信息技術研究和顧問公司Gartner表示&#xff0c;公有云如今具備可擴展性、計算威力、海量存儲和安全性&#xff0c;可打造更好的政府數字化平臺并滿足對業績和價值不斷增長的期望值。 Gartner預計到2018年&#xff0c;提升的安全性將取代成本節約和敏捷性成為政府部門…

一款簡單的縮放拖拽圖片控件

本文介紹一個針對 .NET 桌面應用程序的獨立圖片縮放拖拽顯示控件 SQPhoto[1]。SQPhoto 是一個 Windows 桌面應用的組件&#xff0c;支持 .NET6 和 .NET Framework 4.6 。基于 PictureBox 的圖片展示工具&#xff0c;增加了拖動和縮放功能&#xff0c;便于在某些場景下的圖片展…

安卓虛擬機與Hyper-V沖突

經過各種經驗&#xff0c;哪個安卓虛擬機跟Hyper-V都存在著沖突。 解決方案一 程序中卸載Hyper-V&#xff0c;之后還要再配置太麻煩。 解決方案二 1、關掉Hyper-V的啟動項&#xff0c;命令如下。 bcdedit /set hypervisorlaunchtype off 重啟在開安卓模擬器藍屏就沒有了。 2、重…

共軌之家獲吉利家族基金新一輪融資 5個月前曾獲磐霖資本領投A輪融資

11月27日消息&#xff0c;近日&#xff0c;國內最大商用車技術服務平臺共軌之家對外宣布完成新一輪融資。本輪融資由吉利家族基金投資&#xff0c;未來將推進共軌之家占領商用車后市場。 成立于2014年的共軌之家&#xff0c;以商用車技術知識科普社區起家&#xff0c;積累起國…

光伏產業的發展推動太陽能組件技術進步

從全球能源發展趨勢的角度來看&#xff0c;太陽能等可再生能源勢必逐步替代不可再生的傳統能源&#xff0c;光伏產業將在全球各國的經濟發展中扮演重要的角色。大力開發和利用光伏產業&#xff0c;對于優化我國能源結構&#xff0c;優化環境&#xff0c;保證我國社會經濟可持續…

HTML怎么讓div全透明,設置div為透明 怎樣才讓div里面的div不透明?

#a{ background:#FFCC33; filter:alpha(opacity:0); width: 300px; heig#a{background:#FFCC33; filter:alpha(opacity50); /*支持 IE 瀏覽器*/-moz-opacity:0.50; /*支持 FireFox 瀏覽器*/opacity:0.50; /*支持 Chrome, Opera, Safari 等瀏覽器*/width: 300px;height:300px;}還…

k64 datasheet學習筆記12---System Integration Module (SIM)

1.前言 Features of the SIM include: System clocking configuration&#xff08;1&#xff09;System clock divide values&#xff08;2&#xff09; Architectural clock gating control&#xff08;3&#xff09; USB clock selection and divide values&#xff08;4&…

informix linux安裝步驟

informix linux安裝步驟整個安裝過程都以root用戶運行1. 創建informix用戶# groupadd informix# useradd -g informix informix2. 創建安裝目錄: "/opt/informix"# mkdir /opt/informix# chown informix.informix /opt/informixyum install libc.so.6 libncurses.so.…

html overflow 樣式,css樣式之overflow-x屬性樣式

overflow-x是overflow子花樣&#xff0c;平日也很少用的。overflow-x設置匿伏溢出過寬模式(比如過寬圖片)、設置對象底部轉折條等重要。overflow-x語法與根本懂得1、overflow-x可設置值overflow-x : visible | auto | hidden| scroll值與解釋引見&#xff1a;visible :  不剪切…

泰國能源部攜手本土企業打造智慧城市

泰國能源部與泰國安美德集團簽署諒解備忘錄&#xff0c;共同投資開發新能源在工業生產領域的應用。俞懿春 攝 泰國能源部與泰國安美德&#xff08;AMATA&#xff09;集團昨天在曼谷簽署諒解備忘錄&#xff0c;以公私合作模式推動安美德智慧城市開發&#xff0c;響應泰國政府提出…

MAMP升級mysql5.6到5.7

RT 1.先把mamp環境停掉 sudo sh /Applications/MAMP/bin/stop.sh 2.然后使用brew安裝mysql5.7 brew install mysql 3.默認安裝的是最新版本&#xff0c;因為是5.7所以要手動設置一下root用戶的密碼,跟著步驟設置就行 /usr/local/Cellar/mysql/5.7.20/bin sudo ./mysql_secure_…