2013-05-24 4 views
5

Я недавно использовал некоторые тесты, пытаясь найти «лучшие» схемы сериализации для C++, а также в Java. Факторы, которые составляют «лучшие» для меня, - это скорость/сериализация, а также результирующий размер сериализованного объекта.Сериализация - различия между C++ и Java

Если я посмотрю на результаты различных фреймворков в Java, я вижу, что полученный байт [] обычно меньше размера объекта в памяти. Это даже в случае со встроенной сериализацией Java. Если вы затем посмотрите на некоторые другие предложения (protobuf и т. Д.), Размер уменьшается еще больше.

Я был очень удивлен, что, когда я смотрел на вещи на C++ (boost, protobuf), результирующий объект обычно не меньше (а в некоторых случаях и больше), чем исходный объект.

Я что-то упустил? Почему я получаю справедливое количество «сжатия» бесплатно на Java, но не на C++?

n.b для измерения размеров объектов в Java, я использую Инструментарий http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

+0

long getObjectSize (Object objectToSize) Возвращает специфическое для реализации соответствие объема хранения, потребляемого указанным объектом. Результат может включать в себя некоторые или все служебные данные объекта и, следовательно, полезен для сравнения в рамках реализации, но не между реализациями. Оценка может измениться во время одного вызова JVM. – user2384396

ответ

3

ли вы сравнить фактический размер данных? Я бы сказал, что у Java больше накладных расходов, поэтому, если вы «сжимаете» данные в сериализованном буфере, количество накладных расходов уменьшается намного больше. В C/C++ у вас почти минимальный размер, необходимый для физического размера данных, поэтому нет места для сжатия. И на самом деле вам нужно добавить дополнительную информацию для десериализации, что может даже привести к росту.

+0

Я обновил сообщение, чтобы показать, как я измеряю размер объекта в Java. Вы имеете в виду, что это не сериализация, которая лучше в Java, это факт, что представление объекта в памяти намного лучше в C++? – imrichardcole

+0

@imrichardcole, Да, вот что я имею в виду. Вы можете сбросить объект, подвергшийся искажению, до строки, а затем сравнить результаты, чтобы увидеть, что происходит на самом деле, поскольку это только мое предположение. – Devolus

1

Размер объекта может быть больше, чем фактический размер данных из-за смещения бит между элементами данных.

Когда объект сериализуется, эти смещенные биты отбрасываются, и в результате сериализованная память объекта меньше.

Поскольку java - это управляемая среда, для управления памятью и собственностью требуется больше таких данных смещения, поэтому их степень сжатия больше.

Смежные вопросы