2017-01-31 20 views
0

私は最終的に、実際のjson libを使用するためのjson出力を生成する安らかなWebサービスをリファクタリングしています。手動でjsonをStringBuilderに手動で構築し、出力に出力します。 スピードは非常に重要です。現在、私は主題に関して非常に貧弱なパフォーマンスを見ています。 私は4つのスレッドが〜4k要求をまとめて実行している小さなベンチマークテストを行っています。これはStringBuilderで5,5秒、JsonGeneratorで134秒かかる。 私は何か間違ったことをしたいと思っています。 このガイドに従っています:http://www.journaldev.com/2315/java-json-examplejavax.json.stream.JsonGeneratorをスピードアップする方法?

スピードを上げるために他のライブラリを調べるべきですか?彼らは私のアプリサーバ(ガラス魚)それは確かに間違いだった

UPDATE上に既に存在しているように私は本当に、オラクルのLIBSを使用して好む - しかし、私は私の非常に自身のJsonGeneratorを、実装の動きを通過しなかったました

  • のStringBuilderがかかった:選択肢のどれよりも全体の多くより良い実行するそうです4319ミリ秒
  • FastJsonGeneratorました:1969ミリ秒(私の赤ちゃん)
  • JsonGeneratorがかかった:3550ミリ秒(Json.createJsonGenerator)
  • JsonObjectは取っ:84829ミリ秒(javax.json.JsonObjectBuilder)

は私がGitHubの上にコードを置く:https://github.com/steffenschumacher/FastJsonGenerator 私の怠惰は、適切なテストを書くことから私を保持し、それは私にそれよりも多くの時間をコストアップ終了〜する必要があります。私の元のテストには欠陥た:

  • 実際のデータ
  • は、JSONの答え
  • を解析する上でCPU時間を費やして取得するためにデータベース接続に依存し、実際に地元のHTTP経由で応答を渡すにCPU時間を過ごしました。

GitHubコードは、出力を/ dev/nullに書き込み、解析せず、動的データを使用せず、事前にインスタンス化されたデータを使用します。 すべての点をありがとう - 私は今私が必要なものがあると思う。

+0

jsonの唯一のJavaライブラリは、良いStringBuilderアプローチよりも遅くなります。 –

+0

@ KrzysztofCichockiしかし、第20因子は疑わしい。 – lexicore

+1

私はそれを最初にプロファイリングしようとします。時間の違いは疑わしいです。私はJSONライブラリ対StringBuilderの減速を期待するだろうが、それほど劇的ではない。コードに問題がある可能性があります。 – lexicore

答えて

0

javax.json.stream.JsonGeneratorについては、StringBuilderとほぼ同じくらい速いはずです(ただし、適切かつ多分最適化された実装で)。 しかし、javax.json.stream.JsonGeneratorはインタフェースです。基礎となる実装は何ですか?それはjsonpですか?

Java用のjsonライブラリはすべて、マップ、リスト、配列、および/またはリフレクションのような内部構造を使用して、json文字列の性質に対応することができます。これはデータを転送するのに非常に強力ですが、jsonディーリングライブラリは本質的に非常に汎用的である必要があることを意味します。何か非常にジェネレイテッドであれば通常は遅くなります。 。このようなデータからJSON文字列を作成するには、単に文字列を追加するよりも時間がかかります。そのため、StringBuilderのアプローチは非常に高速です。

java-only json libはありません。これは、優れたStringBuilderアプローチよりも高速である可能性があります。

StringBuilderでStringsの代わりに(jsonメッセージ構造の要素のように)送信する用意ができたデータを持つbyte []配列を使用すると、StringBuilderのようなアプローチをさらに高速化できます。したがって、基本的には、メッセージの一定の準備部分を含むbytes[]の配列からjsonメッセージの一部を直接送信し、データをbeetweenに置くことができます。

+0

好奇心 - JsonGenerator APIは、すべてのノードを適切な順序で追加する必要があるため、手動で階層構造を手動で維持する必要があるため、StringBuilderの方法をサポートするように実装できます。 outputStreamへの効率的な書き込みのためには、内部状態(pos {root、inObj、inArr}、深さをルートにするための深さ、場合によってはバッファ(bytes [])が必要ですが、これはどのように動作するのですか?私は何かが欠けているはずです... –

+0

出力にデータのチャンクを追加するのは高価ですが、追加する必要があるものを収集するためにデータの構造をトラバースすることは費用がかかります。一般的なデータ構造を持つライブラリを使用するよりも速くなります。 –

+0

しかし、私は失敗します。なぜ、JsonGeneratorがデータをどの構造にも追加する必要があるのはなぜかというと、ストリーミング以外のバリアントとは異なり、オーバーヘッドを持つデータとは異なり、シリアル化されます。 –

関連する問題