13

ソケットで作業し、オブジェクトをシリアライズしているときに、 KryoFSTなど、Java でのオブジェクトのシリアライズを高速化するためのサードパーティ ライブラリがいくつかあることに気付きました。これまでは、Java のシリアライズが最適化されており、最速であると思っていました。これは言語に依存し、より高速であると期待される低レベルのソリューションを提供するためです。ただし、検討中のライブラリは、Java よりも高速であると主張しています。

Java が最速のシリアル化ソリューションを提供できなかった理由を誰か説明できますか? より良いパフォーマンスを犠牲にするのは何のためですか?

前もって感謝します。

4

2 に答える 2

19

いくつかの理由があります (私はhttp://code.google.com/p/fast-serialization/の作成者です) 。

理由:

  • 場合によっては、オブジェクトごとに read/writeObject を複数回呼び出して、各オブジェクトのクラス階層をクロールします。
  • 部分的に悪いコーディング (1.7 で改善)
  • よく使用されるクラスの中には、putfield/getfield などの古い遅い + 時代遅れのシリアライゼーション機能を利用するものがあります。
  • 一時オブジェクトの割り当てが多すぎる
  • 多くの検証 (バージョン管理、実装されたインターフェース)
  • Java 入出力ストリームが遅い
  • フィールド値を設定/取得するリフレクション。
  • プリミティブの代わりに Integer や Long などの「大きな数」を必要とする JDK コレクションの使用。
  • 実装には、特定のアルゴリズムの最適化が欠けています:-)
  • x86 では、プリミティブは (ネイティブではなく Java コードで) ネットワーク バイト オーダーに並べ替えられます。

パフォーマンスを向上させるためには、古いバージョン管理スキームのサポートを放棄し (たとえば、現在の read/writeObject の動作方法は最適ではありません)、バージョン管理サポートなどのいくつかをオプションにするか、よりパフォーマンスに敏感なアプローチを選択する必要があります (可能です)。さらに、HotSpot はいくつかの組み込み関数を追加して、プリミティブの低レベル処理を改善する場合があります。API を設計するときは、パフォーマンスを念頭に置く必要がありますが、これはおそらく JDK シリアライゼーションには当てはまりませんでした。

于 2013-10-18T15:11:29.117 に答える
2

リフレクションを使用するため、Java シリアライゼーションは低速です。JDK シリアライゼーションでは、多くの後方互換性チェックと厳密な型チェックが行われます。しかし、Java シリアライゼーションは、ほとんどの場合、デシリアライゼーション後に 100% 同じオブジェクトを獲得しました。

于 2013-10-18T13:35:48.767 に答える