2013-05-24 7 views
5

Ich habe kürzlich einige Benchmarks ausgeführt, die versuchen, die "besten" Serialisierungsframeworks für C++ und auch in Java zu finden. Die Faktoren, die "am besten" für mich ausmachen, sind die Geschwindigkeit de/Serialisierung und auch die resultierende Größe des serialisierten Objekts.Serialisierung - Unterschiede zwischen C++ und Java

Wenn ich mir die Ergebnisse verschiedener Frameworks in Java anschaue, sehe ich, dass das resultierende Byte [] in der Regel kleiner ist als die Objektgröße im Speicher. Dies ist sogar der Fall bei der eingebauten Java-Serialisierung. Sieht man sich dann einige andere Angebote an (Protobuf etc.), sinkt die Größe noch mehr.

Ich war ziemlich überrascht, dass, wenn ich Dinge auf der C++ - Größe (Boost, Protobuf) betrachtete, das resultierende Objekt im Allgemeinen nicht kleiner (und in einigen Fällen größer) als das ursprüngliche Objekt ist.

Fehle ich hier etwas? Warum bekomme ich eine Menge "Komprimierung" kostenlos in Java, aber nicht in C++?

N. B für die Größe der Objekte in Java zu messen, ich bin mit Instrumentation http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

+0

long getObjectSize (Objekt objectToSize) Gibt eine implementierungsspezifische Approximation der Speichermenge zurück, die vom angegebenen Objekt belegt wurde. Das Ergebnis kann einen Teil oder den gesamten Overhead des Objekts enthalten und ist somit nützlich für den Vergleich innerhalb einer Implementierung, jedoch nicht zwischen Implementierungen. Die Schätzung kann sich während eines einzelnen Aufrufs der JVM ändern. – user2384396

Antwort

3

Haben Sie die absolute Größe der Daten zu vergleichen? Ich würde sagen, dass Java mehr Overhead hat, also, wenn Sie die Daten in einen serialisierten Puffer "komprimieren", verringert sich die Menge an Overhead viel mehr. In C/C++ haben Sie fast das absolute Minimum für die physische Datengröße, so dass es nicht viel Platz für die Komprimierung gibt. Und in der Tat müssen Sie zusätzliche Informationen hinzufügen, um es zu deserialisieren, was sogar zu einem Wachstum führen könnte.

+0

Ich habe den Beitrag aktualisiert, um zu zeigen, wie ich die Objektgröße in Java vermesse. Meinst du das, es ist nicht die Serialisierung, die in Java besser ist, ist es die Tatsache, dass die Objektdarstellung im Speicher in C++ viel besser ist? – imrichardcole

+0

@imrichardcole, Ja, das meine ich. Sie können das searialisierte Objekt auf eine Zeichenfolge ausgeben und dann die Ergebnisse vergleichen, um zu sehen, was wirklich passiert, da dies nur meine Annahme ist. – Devolus

1

Die Objektgröße kann aufgrund der Offset-Bits zwischen den Datenelementen größer als die tatsächliche Datengröße sein.

Wenn ein Objekt serialisiert wird, werden diese Offset-Bits verworfen und der serialisierte Objektspeicher ist daher kleiner.

Da Java eine verwaltete Umgebung ist, wird es mehr solcher Offsetdaten benötigen, um Speicher und Besitz zu kontrollieren, daher ist ihre Komprimierungsrate größer.

Verwandte Themen