最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
.netcore怎樣在網(wǎng)絡(luò)高并發(fā)下提高JSON的處理效率-創(chuàng)新互聯(lián)

這篇文章主要介紹了.net core怎樣在網(wǎng)絡(luò)高并發(fā)下提高JSON的處理效率,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

目前成都創(chuàng)新互聯(lián)公司已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、六安網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

前言

現(xiàn)有的webapi一般都基于JSON的格式來(lái)處理數(shù)據(jù),由于JSON是一個(gè)文本類(lèi)的序列化協(xié)議所以在性能上自然就相對(duì)低效一些。在.net中常用Newtonsoft.Json是最常用的組件,由于提供簡(jiǎn)便基于完整的json的String方法使用起來(lái)非常方便;但也正是這原因?qū)е翹ewtonsoft.Json在性能上一直被說(shuō)慢,雖然Newtonsoft.Json提供Stream的方式來(lái)處理JSON不過(guò)想復(fù)用writer和reader還是需要一些應(yīng)用技巧。如果需要在網(wǎng)絡(luò)通訊中應(yīng)用JSON,那在這里介紹一下SpanJson這個(gè)組件,并通過(guò)一些測(cè)試來(lái)講述如何使用它。

SpanJson介紹


SpanJson是一個(gè)性能相對(duì)不錯(cuò)的JSON組件,組件直接提供了byte[]和stream兩種操作方式,而這兩種方式非常適合在構(gòu)建自有網(wǎng)絡(luò)通訊上使用。通過(guò)這些基礎(chǔ)的字節(jié)和流結(jié)構(gòu)來(lái)處理可以相對(duì)降低一個(gè)大string的開(kāi)銷(xiāo)。不過(guò)這個(gè)組件的熱度并不高,完善成度暫還不如Newtonsoft.Json,不過(guò)asp.net core 在FrameworkBenchmarks測(cè)試上已經(jīng)引入??梢試L試一下使用,組件開(kāi)源地址: https://github.com/Tornhoof/SpanJson (本地下載)

性能測(cè)試


組件提供的方法相對(duì)比較少,從設(shè)計(jì)上來(lái)說(shuō)更多是針對(duì)通訊方面的支持?;赟tream的序列化可以直接掛載在NetStream上,這樣可以節(jié)省數(shù)據(jù)復(fù)制帶來(lái)的開(kāi)銷(xiāo)。不過(guò)反序列化不能直接在有混合數(shù)據(jù)的Stream上進(jìn)行,這或多或少有些可惜。從issues的解答來(lái)看作者也不太愿意在混合數(shù)據(jù)流上進(jìn)行調(diào)整。接下來(lái)針對(duì)bytes和Stream使用進(jìn)行一個(gè)性能測(cè)試,而Stream則采用一個(gè)可復(fù)用池的設(shè)計(jì)

MemoryStream 池的設(shè)計(jì)


public class MemoryStreamPool
 {

  private static System.Collections.Concurrent.ConcurrentStack mPool = new System.Collections.Concurrent.ConcurrentStack();

  public static Stream Pop()
  {
   if (!mPool.TryPop(out JsonMemoryStream result))
   {
    result = new JsonMemoryStream(1024 * 32);
   }
   return result;
  }


  public class JsonMemoryStream : MemoryStream
  {
   public JsonMemoryStream(int size) : base(size) { }

   protected override void Dispose(bool disposing)
   {
    MemoryStreamPool.Push(this);
   }

  }

  private static void Push(JsonMemoryStream stream)
  {
   stream.Position = 0;
   stream.SetLength(0);
   mPool.Push(stream);
  }
 }

測(cè)試內(nèi)容


測(cè)試的方式主要針對(duì)一個(gè)簡(jiǎn)單的對(duì)象和一個(gè)對(duì)象列表,然后在不同線程下bytes和Stream pool這兩種方式的性能差別;壓測(cè)的線程數(shù)據(jù)分別是1,2,4,8,16,24,32,每次測(cè)試執(zhí)行的總數(shù)是100萬(wàn)次,然后統(tǒng)計(jì)出執(zhí)行需要的時(shí)間和并發(fā)量。 測(cè)試代碼:

public class Bytes_JSON : BeetleX.Benchmark.BenchmarkBase
 {
  protected override void OnTest()
  {
   while (Increment())
   {
    var data = SpanJson.JsonSerializer.NonGeneric.Utf8.Serialize(DataHelper.Defalut.Employees[0]);
    var employees = SpanJson.JsonSerializer.Generic.Utf8.Deserialize(data);
   }
  }
 }

 public class StreamPool_JSON : BeetleX.Benchmark.BenchmarkBase
 {
  protected override void OnTest()
  {
   RunTest();
  }

  private async void RunTest()
  {
   while (Increment())
   {
    using (Stream stream = MemoryStreamPool.Pop())
    {
     await SpanJson.JsonSerializer.NonGeneric.Utf8.SerializeAsync(DataHelper.Defalut.Employees[0], stream);
     stream.Position = 0;
     var employees = await SpanJson.JsonSerializer.Generic.Utf8.DeserializeAsync(stream);
    }
   }
  }
 }


 public class Bytes_JSON_List : BeetleX.Benchmark.BenchmarkBase
 {
  protected override void OnTest()
  {
   while (Increment())
   {
    var data = SpanJson.JsonSerializer.NonGeneric.Utf8.Serialize(DataHelper.Defalut.Employees);
    var employees = SpanJson.JsonSerializer.Generic.Utf8.Deserialize>(data);
   }
  }
 }

 public class StreamPool_JSON_List : BeetleX.Benchmark.BenchmarkBase
 {
  protected override void OnTest()
  {
   RunTest();
  }

  private async void RunTest()
  {
   while (Increment())
   {
    using (Stream stream = MemoryStreamPool.Pop())
    {
     await SpanJson.JsonSerializer.NonGeneric.Utf8.SerializeAsync(DataHelper.Defalut.Employees, stream);
     stream.Position = 0;
     var employees = await SpanJson.JsonSerializer.Generic.Utf8.DeserializeAsync>(stream);
    }
   }
  }
 }

測(cè)試結(jié)果

C:\Users\Administrator\Desktop\json_test>dotnet JsonSample.dll
BeetleX.Benchmark [0.5.4.0] Copyright ? ikende.com 2019
EMail:[email protected]
Github:https://github.com/ikende
-------------------------------------------------------------------------------
|Name                          | Round| Threads|     Count| Use time(s)|   Sec|
-------------------------------------------------------------------------------
|Bytes_JSON                    |     1|       1|   1000000|        5.57|179580|
-------------------------------------------------------------------------------
|StreamPool_JSON               |     1|       1|   1000000|        5.44|183898|
-------------------------------------------------------------------------------
|Bytes_JSON_List               |     1|       1|   1000000|       43.01| 23248|
-------------------------------------------------------------------------------
|StreamPool_JSON_List          |     1|       1|   1000000|       42.75| 23391|
-------------------------------------------------------------------------------
|Bytes_JSON                    |     1|       2|   1000000|        2.81|355990|
-------------------------------------------------------------------------------
|StreamPool_JSON               |     1|       2|   1000000|        2.95|338969|
-------------------------------------------------------------------------------
|Bytes_JSON_List               |     1|       2|   1000000|       23.16| 43180|
-------------------------------------------------------------------------------
|StreamPool_JSON_List          |     1|       2|   1000000|        22.4| 44650|
-------------------------------------------------------------------------------
|Bytes_JSON                    |     1|       4|   1000000|        1.51|661246|
-------------------------------------------------------------------------------
|StreamPool_JSON               |     1|       4|   1000000|        1.57|636130|
-------------------------------------------------------------------------------
|Bytes_JSON_List               |     1|       4|   1000000|       13.35| 74915|
-------------------------------------------------------------------------------
|StreamPool_JSON_List          |     1|       4|   1000000|       11.97| 83508|
-------------------------------------------------------------------------------
|Bytes_JSON                    |     1|       8|   1000000|         .83|1199453|
--------------------------------------------------------------------------------
|StreamPool_JSON               |     1|       8|   1000000|         .88|1142495|
--------------------------------------------------------------------------------
|Bytes_JSON_List               |     1|       8|   1000000|        9.24|108228|
-------------------------------------------------------------------------------
|StreamPool_JSON_List          |     1|       8|   1000000|        6.75|148132|
-------------------------------------------------------------------------------
|Bytes_JSON                    |     1|      16|   1000000|         .56|1795910|
--------------------------------------------------------------------------------
|StreamPool_JSON               |     1|      16|   1000000|         .74|1344851|
--------------------------------------------------------------------------------
|Bytes_JSON_List               |     1|      16|   1000000|        7.67|130424|
-------------------------------------------------------------------------------
|StreamPool_JSON_List          |     1|      16|   1000000|        4.61|216860|
-------------------------------------------------------------------------------
|Bytes_JSON                    |     1|      24|   1000000|         .54|1849769|
--------------------------------------------------------------------------------
|StreamPool_JSON               |     1|      24|   1000000|         .73|1361382|
--------------------------------------------------------------------------------
|Bytes_JSON_List               |     1|      24|   1000000|        7.61|131373|
-------------------------------------------------------------------------------
|StreamPool_JSON_List          |     1|      24|   1000000|         4.7|212779|
-------------------------------------------------------------------------------
|Bytes_JSON                    |     1|      32|   1000000|         .55|1825484|
--------------------------------------------------------------------------------
|StreamPool_JSON               |     1|      32|   1000000|         .75|1339050|
--------------------------------------------------------------------------------
|Bytes_JSON_List               |     1|      32|   1000000|        8.01|124885|
-------------------------------------------------------------------------------
|StreamPool_JSON_List          |     1|      32|   1000000|        5.21|192038|
-------------------------------------------------------------------------------
Test completed!


總結(jié)


從測(cè)試結(jié)果來(lái)看,如果序列化的對(duì)象比小,那可以直接基于bytes的方式。雖然會(huì)產(chǎn)生新的bytes對(duì)象,不過(guò)由于對(duì)象比較小,引起的分配和回收并沒(méi)有對(duì)象池操作上的損耗高。不過(guò)如果對(duì)象相對(duì)復(fù)雜些的情況下,那對(duì)象池的作用就能發(fā)揮出來(lái),并發(fā)越大其作用越明顯!,當(dāng)并發(fā)線程數(shù)達(dá)到8的時(shí)候,效率已經(jīng)明顯拋開(kāi)!由于業(yè)務(wù)上的數(shù)據(jù)信息都相對(duì)比較復(fù)雜些,所以在處理上還是建議通過(guò)對(duì)象池的方式來(lái)完成json序列化處理。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“.net core怎樣在網(wǎng)絡(luò)高并發(fā)下提高JSON的處理效率”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!


文章標(biāo)題:.netcore怎樣在網(wǎng)絡(luò)高并發(fā)下提高JSON的處理效率-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://fisionsoft.com.cn/article/cssesh.html