Я не сравнивал протокольные буферы с собственной сериализацией Java с точки зрения скорости, но для интероперабельности. Собственная сериализация Java является серьезной проблемой no-no. В большинстве случаев это также не так эффективно с точки зрения пространства, как протокольные буферы. Конечно, это несколько более гибко с точки зрения того, что он может хранить, и с точки зрения ссылок и т. Д. Буферы протоколов очень хороши в том, для чего он предназначен, и когда он соответствует вашим потребностям, это здорово - но есть очевидные ограничения из-за совместимости (и другие вещи).
Недавно я опубликовал базовую платформу протоколов буферов в Java и .NET. Версия Java находится в main Google project (в), версия .NET находится в my C# port project. Если вы хотите сравнить скорость PB со скоростью сериализации Java, вы можете написать похожие классы и сравнить их. Если вы заинтересованы в interop, хотя, я бы действительно не дал собственную сериализацию Java (или родную двоичную сериализацию .NET) вторую мысль.
Есть и другие варианты интероперабельной сериализации, кроме протокольных буферов, хотя - Thrift, JSON и YAML Приходят в голову, и есть, несомненно, другие.
EDIT: Хорошо, если interop не так важен, стоит попытаться перечислить различные качества, которые вы хотите, из рамки сериализации. Одна вещь, о которой вы должны подумать, это управление версиями - это еще одна вещь, которую PB предназначен для хорошей обработки, как назад, так и вперед (так что новое программное обеспечение может читать старые данные и наоборот) - когда вы придерживаетесь предложенных правил, конечно :)
Попытавшись быть осторожным в отношении производительности Java и собственной сериализации, я действительно не удивлюсь, что PB все равно будет быстрее. Если у вас есть такая возможность, используйте сервер vm - мои недавние тесты показали, что VM сервера в два раза быстрее при сериализации и десериализации данных образца. Я думаю, что код PB подходит для JIT сервера VM очень хорошо :)
Как примерные показатели производительности, сериализация и десериализация двух сообщений (один 228 байт, один 84750 байт) Я получил эти результаты на своем ноутбуке с использованием VM сервера:
Benchmarking benchmarks.GoogleSize$SizeMessage1 with file google_message1.dat
Serialize to byte string: 2581851 iterations in 30.16s; 18.613789MB/s
Serialize to byte array: 2583547 iterations in 29.842s; 18.824497MB/s
Serialize to memory stream: 2210320 iterations in 30.125s; 15.953759MB/s
Deserialize from byte string: 3356517 iterations in 30.088s; 24.256632MB/s
Deserialize from byte array: 3356517 iterations in 29.958s; 24.361889MB/s
Deserialize from memory stream: 2618821 iterations in 29.821s; 19.094952MB/s
Benchmarking benchmarks.GoogleSpeed$SpeedMessage1 with file google_message1.dat
Serialize to byte string: 17068518 iterations in 29.978s; 123.802124MB/s
Serialize to byte array: 17520066 iterations in 30.043s; 126.802376MB/s
Serialize to memory stream: 7736665 iterations in 30.076s; 55.93307MB/s
Deserialize from byte string: 16123669 iterations in 30.073s; 116.57947MB/s
Deserialize from byte array: 16082453 iterations in 30.109s; 116.14243MB/s
Deserialize from memory stream: 7496968 iterations in 30.03s; 54.283176MB/s
Benchmarking benchmarks.GoogleSize$SizeMessage2 with file google_message2.dat
Serialize to byte string: 6266 iterations in 30.034s; 16.826494MB/s
Serialize to byte array: 6246 iterations in 30.027s; 16.776697MB/s
Serialize to memory stream: 6042 iterations in 29.916s; 16.288969MB/s
Deserialize from byte string: 4675 iterations in 29.819s; 12.644595MB/s
Deserialize from byte array: 4694 iterations in 30.093s; 12.580387MB/s
Deserialize from memory stream: 4544 iterations in 29.579s; 12.389998MB/s
Benchmarking benchmarks.GoogleSpeed$SpeedMessage2 with file google_message2.dat
Serialize to byte string: 39562 iterations in 30.055s; 106.16416MB/s
Serialize to byte array: 39715 iterations in 30.178s; 106.14035MB/s
Serialize to memory stream: 34161 iterations in 30.032s; 91.74085MB/s
Deserialize from byte string: 36934 iterations in 29.794s; 99.98019MB/s
Deserialize from byte array: 37191 iterations in 29.915s; 100.26867MB/s
Deserialize from memory stream: 36237 iterations in 29.846s; 97.92251MB/s
«Скорость» и «размер» - это то, был ли сгенерированный код оптимизирован для скорости или размера кода. (Сериализованные данные в обоих случаях одинаковы. Версия «размер» предоставляется для случая, когда вы определили много сообщений и не хотите получать много памяти для кода.)
Как вы можете видеть, для меньшего сообщения это может быть очень быстро - более 500 небольших сообщений, сериализованных или десериализованных за миллисекунду. Даже с сообщением 87K он принимает менее миллисекунды за сообщение.
Всестороннее сравнение производительности различных форматов сериализации - http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/ – Maxim
Я знаю, это старый вопрос, но есть Benchmark-Project https://github.com/eishay/jvm-serializers/wiki, посвященный сериализации Java. – kromit