1

現在、を使用して長いデータをシリアル化していますDataOutput.writeLong(long)。これに関する問題は明らかです。long が非常に小さい場合がたくさんあります。最もパフォーマンスの高い varint 実装は何ですか? 私はプロトコル バッファから戦略を見て、ランダムな長いデータ (おそらくテストするのに適したディストリビューションではない) でテストしたところ、かなり大きなパフォーマンスの低下が見られました (約 3 倍から 4 倍遅くなりました)。これは予想されることですか?スペースを節約しながらできるだけ早く long をシリアライズするための良い戦略はありますか?

ご協力いただきありがとうございます!

4

2 に答える 2

0

プロトコル バッファ エンコーディングは実際にはかなり優れていますが、ランダムな long では役に立ちません。long が小さな正または負の数値になる可能性が高い場合に最も役立ちます (95% の確率で +/- 1000 の範囲としましょう)。 .

この範囲の数値は通常、通常の long の 8 と比較して、1、2、または 3 バイトでエンコードされます。long の大規模なセットでこの種の入力を試してみてください。多くの場合、50 ~ 70% のスペースを節約できます。

もちろん、このエンコーディングの計算にはいくらかのパフォーマンス オーバーヘッドがありますが、これをシリアライゼーションに使用している場合は、とにかく CPU 時間がボトルネックにならないため、エンコーディング コストを効果的に無視できます。

于 2012-05-22T07:34:37.557 に答える
0

シリアル化に標準DataOutputフォーマットを使用し、圧縮などの一般的な圧縮アルゴリズムを使用するのはGZIPOutputStreamどうですか?

于 2012-05-22T07:17:49.173 に答える