ネットでどうやって高効率でJSONの処理効率を向上させますか?


前言
既存のwebapiは一般的にJSONのフォーマットに基づいてデータを処理しています。JSONはテキストクラスのプログレッシブプロトコルですので、性能的には当然、比較的効果が低いです。ネットでよく使われているNewtonift.Jsonは最もよく使われているコンポーネントです。簡単で完璧なjsonに基づくString方法を提供するので、とても便利です。しかし、この原因はNewtonift.Jsonが性能面で遅く言われています。Newtonift.JsonがStreamを提供する方式でJSONを処理していますが、writerとreaderを多重化するにはまだいくつかの応用技術が必要です。ネットワーク通信にJSONを適用する必要があるなら、ここでSpanJsonというコンポーネントを紹介し、いくつかのテストを通してどのようにそれを使うかを説明します。
SpanJson紹介
SpanJsonは性能が比較的良いJSONコンポーネントで、コンポーネントは直接にbyte[]とsteamの2つの操作方式を提供していますが、この2つの方法は自己ネットワーク通信の構築にとても適しています。これらの基本的なバイトおよびストリーム構造によって処理すると、大きなs tringのオーバーヘッドが相対的に低減され得る。でも、この部品の熱は高くないです。完成度はまだNewtonift.Jsonに及ばないです。でも、asp.net coreはFramwork Benchmarksテストに導入されました。使ってみてもいいです。コンポーネントオープンアドレス:https://github.com/Tornhoof/SpanJson ( ローカルダウンロード
性能テスト
コンポーネントが提供する方法は比較的少ないです。デザインから言えば、通信に対するサポートがもっと多いです。Streamベースの順序化は、NetStreamに直接マウントでき、データコピーによるオーバヘッドを節約することができる。ただ、逆プログレッシブは直接に混合データがあるStreamでは行われないので、少し残念です。isesの解答から見ても作者は混合データの流れを調整するのがあまり好きではないです。次に、bytesとStreamに対して性能テストを行いますが、Streamは多重化可能なプールの設計を採用します。
メモリ・スタジオのデザイン

public class MemoryStreamPool
 {

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

  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);
  }
 }
テスト内容
テストの方式は主に簡単なオブジェクトと一つのオブジェクトリストに対して、そして異なるスレッドの下でbytesとStream poolという2つの方式の性能の差があります。測定スレッドデータはそれぞれ1,2,4,8,16,24,32であり、各テストの実行総数は100万回であり、実行に必要な時間と同時量を統計している。テストコード:

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<Employee>(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<Employee>(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<List<Employee>>(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<List<Employee>>(stream);
    }
   }
  }
 }
テスト結果
C:\Users\Administrator\Desktop\json_test>dotnet Json Sample.dll
BeetleX.Benchmark[0.5.0]Copyright?ikiende.com 2019
EMail:[email protected]
Github:https://github.com/ikende
---------------------------------------------
ヽoo。ツ                          | Round 124 Threads 124     Count 124 Use time(s)124   Sec 124
---------------------------------------------
|Bytes_JSON                    |     1|       1|   100000|        5.57|179580|
---------------------------------------------
|Stream Pool_JSON               |     1|       1|   100000|        5.44𞓜183898|
---------------------------------------------
|Bytes_JSON_List               |     1|       1|   100000|       43.01|23248|
---------------------------------------------
|Stream Pool_JSON_List          |     1|       1|   100000|       42.75|233391|
---------------------------------------------
|Bytes_JSON                    |     1|       2|   100000|        2.81|355990|
---------------------------------------------
|Stream Pool_JSON               |     1|       2|   100000|        2.95|338969|
---------------------------------------------
|Bytes_JSON_List               |     1|       2|   100000|       23.16𞓜43180𞓜
---------------------------------------------
|Stream Pool_JSON_List          |     1|       2|   100000|        22.4|44650𞓜
---------------------------------------------
|Bytes_JSON                    |     1|       4|   100000|        1.51|661246𞓜
---------------------------------------------
|Stream Pool_JSON               |     1|       4|   100000|        1.57_|
---------------------------------------------
|Bytes_JSON_List               |     1|       4|   100000|       13.35|74915|
---------------------------------------------
|Stream Pool_JSON_List          |     1|       4|   100000|       11.97|83508|
---------------------------------------------
|Bytes_JSON                    |     1|       8|   100000|         .83|1199453|
--------------------------------------------------
|Stream Pool_JSON               |     1|       8|   100000|         .88|1142495|
--------------------------------------------------
|Bytes_JSON_List               |     1|       8|   100000|        9.24|1080228|
---------------------------------------------
|Stream Pool_JSON_List          |     1|       8|   100000|        6.75|14832|
---------------------------------------------
|Bytes_JSON                    |     1|      16|   100000|         .56|1795910|
--------------------------------------------------
|Stream Pool_JSON               |     1|      16|   100000|         .74|1344851|
--------------------------------------------------
|Bytes_JSON_List               |     1|      16|   100000|        7.67|130424|
---------------------------------------------
|Stream Pool_JSON_List          |     1|      16|   100000|        4.61ゴ216860|
---------------------------------------------
|Bytes_JSON                    |     1|      24|   100000|         .54|189769|
--------------------------------------------------
|Stream Pool_JSON               |     1|      24|   100000|         .73|1361382|
--------------------------------------------------
|Bytes_JSON_List               |     1|      24|   100000|        7.61|131313373|
---------------------------------------------
|Stream Pool_JSON_List          |     1|      24|   100000|         4.7|212779|
---------------------------------------------
|Bytes_JSON                    |     1|      32|   100000|         .55|1825484|
--------------------------------------------------
|Stream Pool_JSON               |     1|      32|   100000|         .75|1339050|
--------------------------------------------------
|Bytes_JSON_List               |     1|      32|   100000|        8.01 124885𞓜
---------------------------------------------
|Stream Pool_JSON_List          |     1|      32|   100000|        5.21|192038|
---------------------------------------------
Test completted
締め括りをつける
テスト結果から見ると、順序化されたオブジェクトが小さい場合、直接bytes方式に基づくことができます。新しいbytesオブジェクトが発生しますが、対象が小さいため、配布と回収は対象プールの操作上の損失が高いわけではありません。しかし、相手がもっと複雑な場合は、相手の池の役割が発揮され、同時に大きな役割を果たすことができます。同時スレッド数が8に達すると、効率は明らかに捨てられています。業務上のデータ情報は比較的複雑なので、対象プールの方式でJsonのプログレッシブ処理を行うことを推奨します。
試験コードのダウンロード:http://xiazai.jb51.net/201904/yuanma/JsonSample(jb 51).rar
はい、以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持つことを望んでいます。ありがとうございます。