这篇文章主要介绍了。net核心怎样在网络高并发下提高JSON的处理效率,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
<强>前言强>
现有的webapi一般都基于JSON的格式来处理数据,由于JSON是一个文本类的序列化协议所以在性能上自然就相对低效一些。在。net中常用Newtonsoft.Json是最常用的组件,由于提供简便基于完整的JSON字符串的方法使用起来非常方便,但也正是这原因导致Newtonsoft.Json在性能上一直被说慢,虽然Newtonsoft.Json提供流的方式来处理JSON不过想复用作者和读者还是需要一些应用技巧。如果需要在网络通讯中应用JSON,那在这里介绍一下SpanJson这个组件,并通过一些测试来讲述如何使用它。
<强> SpanJson介绍强>
SpanJson是一个性能相对不错的JSON组件,组件直接提供了byte[]和流两种操作方式,而这两种方式非常适合在构建自有网络通讯上使用。通过这些基础的字节和流结构来处理可以相对降低一个大的字符串的开销。不过这个组件的热度并不高,完善成度暂还不如Newtonsoft.Json,不过asp.net核心在FrameworkBenchmarks测试上已经引入。可以尝试一下使用,组件开源地址:https://github.com/Tornhoof/SpanJson (本地下载)
<>强性能测试强>
组件提供的方法相对比较少,从设计上来说更多是针对通讯方面的支持。基于流的序列化可以直接挂载在NetStream上,这样可以节省数据复制带来的开销。不过反序列化不能直接在有混合数据的流上进行,这或多或少有些可惜。从问题的解答来看作者也不太愿意在混合数据流上进行调整。接下来针对字节和流使用进行一个性能测试,而流则采用一个可复用池的设计
<强> MemoryStream池的设计
强>
public class MemoryStreamPool ,{ private 才能static System.Collections.Concurrent.ConcurrentStack< JsonMemoryStream>, mPool =, new System.Collections.Concurrent.ConcurrentStack(); public 才能;static  Stream 流行() {才能 ,,if (! mPool.TryPop (out JsonMemoryStream 结果)) ,,{ ,,,result =, new JsonMemoryStream (1024, *, 32); ,,} ,,return 结果; ,,} public 才能class JsonMemoryStream : MemoryStream {才能 ,,public JsonMemoryStream (int 大小),:,基地(大小),{,} ,,protected override  void 处理(bool 处理) ,,{ ,,,MemoryStreamPool.Push(这个); ,,} ,,} private 才能;static  void 推动(JsonMemoryStream 流) {才能 ,,stream.Position =, 0; ,,stream.SetLength (0); ,,mPool.Push(流); ,,} ,}
<强>测试内容强>
测试的方式主要针对一个简单的对象和一个对象列表,然后在不同线程下字节和流池这两种方式的性能差别;压测的线程数据分别是1、2、4、8、16、24、32岁,每次测试执行的总数是100年万次,然后统计出执行需要的时间和并发量。测试代码:
public class Bytes_JSON : BeetleX.Benchmark.BenchmarkBase ,{ protected 才能override void 击打() {才能 ,,while (增量()) ,,{ ,,,var data =, SpanJson.JsonSerializer.NonGeneric.Utf8.Serialize (DataHelper.Defalut.Employees [0]); ,,,var employees =, SpanJson.JsonSerializer.Generic.Utf8.Deserialize(数据); ,,} ,,} ,} ,public class StreamPool_JSON : BeetleX.Benchmark.BenchmarkBase ,{ protected 才能override void 击打() {才能 ,,小牛(); ,,} private 才能;async  void 小牛() {才能 ,,while (增量()) ,,{ ,,,using (Stream Stream =, MemoryStreamPool.Pop ()) ,,,{ ,,,,await SpanJson.JsonSerializer.NonGeneric.Utf8.SerializeAsync (DataHelper.Defalut.Employees[0],,流); ,,,,stream.Position =, 0; ,,,,var employees =, await SpanJson.JsonSerializer.Generic.Utf8.DeserializeAsync (流); ,,,} ,,} ,,} ,} ,public class Bytes_JSON_List : BeetleX.Benchmark.BenchmarkBase ,{ protected 才能override void 击打() {才能 ,,while (增量()) ,,{ ,,,var data =, SpanJson.JsonSerializer.NonGeneric.Utf8.Serialize (DataHelper.Defalut.Employees); ,,,var employees =, SpanJson.JsonSerializer.Generic.Utf8.Deserialize net核心怎样在网络高并发下提高JSON的处理效率