3

Kryoは本当に速くて小さいです。ここに秘密は何ですか?

私はしばらくそのコードに飛び込んでいますが、まだいくつかのガイダンスが必要です.

ありがとう。

4

1 に答える 1

4

彼らのページから:

2.22 リリースでは、報告された多くの問題が修正され、安定性とパフォーマンスが向上しています。また、多くの新機能も導入されています。特に、Unsafe を使用してオブジェクト メモリを直接読み書きできるようになっています。これは、特に大規模なプリミティブ配列の場合、シリアル化を行うための絶対的に最速の方法です。

sun.misc.UnsafeフィールドまたはASM ライブラリへのバイトコード レベルの直接アクセスを使用します。Kryo は、安全でない使用方法を導入する前でも高速でした。一般的な答えは、パフォーマンスが最優先事項だということだと思います。Java のリフレクションは、注意して使用すればそれほど遅くはありません。つまり、java.lang.Fieldjava.lang.Methodがキャッシュされている場合です。2 つの異なるコンパレータを使用して配列をソートする実験をセットアップしました。1 つは直接フィールド アクセスを使用し、もう 1 つはキャッシュ フィールドを使用していました。わずか 2 倍の差でした。これは、IO のコンテキストでは目立たないことを意味します。

フィールドシリアライザー:

デフォルトでは、ほとんどのクラスは最終的にFieldSerializer. 基本的に、手書きのシリアル化と同じことを行いますが、自動的に行います。FieldSerializerオブジェクトのフィールドへの直接代入を行います。フィールドがパブリック、プロテクト、またはデフォルト アクセス (パッケージ プライベート) の場合、最大速度のためにバイトコード生成が使用されます (ReflectASM を参照)。プライベート フィールドには、setAccessible とキャッシュされたリフレクションが使用されますが、これは依然として非常に高速です。

于 2013-11-21T16:15:40.017 に答える