2013-05-24 15 views
5

私は最近、C++とJavaの "最良の"シリアライゼーションフレームワークを見つけようとしているベンチマークを実行しています。私にとって「最高」を構成する要素は、de/serializeのスピードと直列化されたオブジェクトの結果のサイズです( )。シリアライゼーション - C++とJavaの違い

Javaのさまざまなフレームワークの結果を見ると、結果のバイト[]は一般にメモリのオブジェクトサイズよりも小さいことがわかります。これは、組み込みのJavaのシリアル化の場合でもそうです。他の製品(protobufなど)のいくつかを見ると、サイズはさらに小さくなります。

私はC++サイズ(boost、protobuf)のものを見ると、結果オブジェクトが元のオブジェクトよりも一般に小さくない(場合によっては大きくなる)ことに驚いていました。

ここに何か不足していますか? C++ではなく、Javaで空き領域を「圧縮」するのはなぜですか? Javaでオブジェクトのサイズを測定するための

n.bは、私は計装http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

+0

long getObjectSize(Object objectToSize) 指定されたオブジェクトが消費するストレージの量の実装固有の近似値を返します。結果には、オブジェクトのオーバーヘッドの一部またはすべてが含まれている可能性があるため、実装内での比較には役立ちますが、実装間の比較には役立ちません。 JVMの1回の呼び出し中に見積もりが変更されることがあります。 – user2384396

答えて

3

を使用していますが、データの絶対的な大きさを比較しましたか? Javaにはオーバーヘッドが増えていると言えます。データをシリアライズされたバッファに「圧縮」すれば、オーバーヘッドが大幅に減少します。 C/C++では、物理データサイズに必要な最小限のものがほとんどあるので、圧縮の余地はあまりありません。実際には、デシリアライズするために追加情報を追加する必要があり、それによってさらに成長する可能性があります。

+0

私は、Javaでオブジェクトサイズをどのように測定しているかを示すために、この記事を更新しました。あなたは、Javaでより優れたシリアライゼーションではないことを意味しますか?C++では、メモリ内のオブジェクト表現がはるかに優れています。 – imrichardcole

+0

@imrichardcole、はい、そうです。あなたは文字列に体系化されたオブジェクトをダンプして、実際に何が起こっているかを見るために結果を比較することができます。これは私の前提です。 – Devolus

1

オブジェクトのサイズは、データメンバー間のオフセットビットのために実際のデータサイズよりも大きくなることがあります。

オブジェクトがシリアル化されると、これらのオフセットビットは破棄され、その結果シリアル化されたオブジェクトメモリは小さくなります。

javaは管理された環境であるため、メモリや所有権を制御するために、より多くのオフセットデータが必要になるため、圧縮率が高くなります。

関連する問題