38

Kryoは非常に新しく興味深い Java シリアライゼーション ライブラリであり、thrift-protobufベンチマークで最速のライブラリの 1 つです。Kryo を使用したことがある場合、製品コードで試すのに十分な成熟度に達していますか?

更新 (2010 年 10 月 27 日):まだ本番環境ではありませんが、Kryo を使用しています。詳細については、以下の私の回答を参照してください。

更新 (2011 年 3 月 9 日):最新の Jackson および Kryo ライブラリに更新すると、Jackson のバイナリ Smile シリアライゼーションはかなり競争力があることがわかります。

4

9 に答える 9

23

私は自分の質問に答えようとします (Kyro はまだ非常に新しいです!)。

Restlet フレームワークを使用して実装された約 120 の異なる Web サービスのセットがあります。これらは、通常、Restlet ベースのクライアント ライブラリの上に構築された Web サービス クライアントによって使用されます。サーバーとクライアントの間でやり取りされる表現には、XML ( XStream シリアライゼーション ライブラリを使用)、JSON ( Jacksonを使用)、XHTML、Java オブジェクトシリアライゼーション、そして昨日の時点ではKryoが含まれます。したがって、私たちはいくつかの堅実な比較を行う立場にあります.

Kryo 1.0.1 はかなり安定しているようです。API の使用方法を実際に読んでみると、唯一の本当の問題は、デフォルトの java.util.Date シリアライザーが日付を数か月前に歪めているように見えることでした。独自のオーバーライドを提供する必要がありました。

kryo.register(Date.class, 
  new SimpleSerializer<Date>() {
   @Override public void write (ByteBuffer b, Date d) { b.putLong(d.getTime()); }
   @Override public Date read (ByteBuffer b) { return new Date(b.getLong()); }
  });

しかし、それは私がこれまでに見つけた唯一の可能な問題でした。String、Float、Integer、Long、Date、Boolean、および List フィールドを持つ一連の JavaBeans があります。

ここにいくつかの大まかなベンチマークがあります。まず、1 つのテレビ番組を記述するオブジェクト階層のシリアル化と逆シリアル化を 100,000 回実行しました (つまり、その番組の 100,000 のディープ コピーを作成しました)。速度は次のとおりです。

XStream XML:                 360/sec
Java Object Serialization: 1,570/sec
Jackson JSON:              5,000/sec
Kryo:                      8,100/sec

次に、2,000 のテレビ番組の説明のカタログもシリアル化し、バイト数をカウントしました。

XStream XML:         6,837,851 bytes
Jackson JSON:        3,656,654 bytes
Kryo:                1,124,048 bytes

また、シリアライザーの登録が非常に重要であることもわかりました。

kryo.register(List.class);
kryo.register(ArrayList.class);
// ...
kryo.register(Program.class);
kryo.register(Catalog.class);
// ...

そうしないと、シリアライゼーションのサイズはほぼ 2 倍になり、速度はおそらく 40% 遅くなりました。

また、これら 4 つのシリアル化方法のそれぞれを使用して、いくつかの Web サービスの完全なエンド ツー エンド テストを実行し、Kryo が他の方法よりも高速に実行されることも示しました。

要約すると、Kryo はかなり堅牢なようです。コードベースでのサポートを維持し、経験を積むにつれて、より多くの場所で使用したいと考えています。Kryoチームに称賛を!

更新 (2011 年 3 月 9 日): Jackson 1.6 のバイナリ「Smile」シリアライザーを試すという @StaxMan の提案にようやくたどり着きました。Jackson 1.6 と Kryo 1.04 を使用して、多少異なるテレビ番組オブジェクト階層の 100,000 のディープ コピー (シリアル化/逆シリアル化) を行いました。

XStream XML:     429/sec    5,189 bytes
Jackson JSON:  4,474/sec    2,657 bytes
Kryo:          4,539/sec    1,066 bytes  
Jackson Smile: 5,040/sec    1,689 bytes

このテストは、これらのオブジェクトの多くを配信する REST Web サービスでさまざまなシリアライザーを試したマクロ レベルのテストとは一致しませんでした。システム全体のスループットは、パフォーマンスに関する @StaxMan の直感をサポートしています。

Jackson JSON:     92 requests/sec
Jackson Smile     97 requests/sec
Kryo:            108 requests/sec
于 2010-04-30T18:48:47.703 に答える
17

バグ レポートディスカッション スレッドがあります。Kryo に付属する DateSerializer は、正の値に最適化された LongSerializer を使用するため、SO に掲載されている SimpleSerializer 実装よりもサイズの点でわずかに効率的です。

編集:元の質問に答えるのを忘れました。Kryo は、少なくともいくつかのプロダクション システムで使用されていると思います。これについては、この記事Jive SBS キャッシュの再設計: パート 3で言及されています。Destroy All Humansプロジェクトでは、ロボットの頭脳として機能する Android フォンとの通信に Kryo が使用されています (ビデオはこちら)。

直接的な答えではありませんが、Kryo のソースjavadocsを参照してください。Kryo クラスの read* メソッドと write* メソッドを調べてから、Serializer クラスを見てください。これは本当にライブラリのコアです。

于 2010-08-04T00:28:56.787 に答える
4

Kryo は Yahoo の S4 (Simple Scalable Streaming System) プロジェクトの一部です。私の知る限り、S4 はまだ製品化されていません。

于 2011-03-23T15:34:52.490 に答える
2

上記のJimFerransの回答とコメントの助けを借りて、私はこのページでKryoの日付シリアル化の問題に関するより詳細な説明を見つけました:http://groups.google.com/group/kryo-users/browse_thread/thread/91969c6f48a45bdf/そして またKryoのDateSerializer()の使い方:

kryo.register(Date.class、new DateSerializer());

これが他の人の役に立つことを願っています。

于 2012-03-05T23:55:41.997 に答える
1

Kryo サイトには、Kryo を使用した生産中のプロジェクトに関するセクションがあります。

于 2013-09-02T18:11:32.140 に答える
1

Kryo の最新バージョンには、Java から ns-3 へのシミュレーター インターフェイスで実行される、いくつかの極端なケースでいくつかの競合状態があります。問題がなければ、開発者に私の変更の一部をコミットするよう依頼するかもしれません。

于 2011-04-13T21:03:43.600 に答える
1

Kryo 2.x は Mule ESB でも使用されており、本番環境で広く使用されています。

于 2015-02-20T15:47:05.113 に答える
1

Apache Storm は、あるタスクから別のタスクにメッセージを渡す前のシリアル化にこれを使用します。

つまり、Storm は複数の大企業、つまり Twitter や Spotify で使用されているため、非常に安定しているはずです。

于 2014-06-21T16:32:08.450 に答える