Я не сравнивал буферы протокола с собственной сериализацией Java с точки зрения скорости, но для совместимости собственная сериализация Java - серьезное нет-нет. В большинстве случаев он также не будет столь же эффективным с точки зрения пространства, как буферные протоколы. Конечно, он несколько более гибкий с точки зрения того, что он может хранить, а также с точки зрения ссылок и т. Д. Протоколные буферы очень хороши для того, для чего они предназначены, и когда они соответствуют вашим потребностям, это здорово - но есть очевидные ограничения из-за взаимодействия (и другие вещи).
Недавно я опубликовал инфраструктуру тестирования протоколов в Java и .NET. Версия Java находится в основном проекте Google (в каталоге тестов ), версия .NET находится в моем проекте C # port . Если вы хотите сравнить скорость PB со скоростью сериализации Java, вы можете написать схожие классы и сравнить их. Однако, если вы заинтересованы во взаимодействии, я бы не стал задумываться о нативной сериализации Java (или нативной двоичной сериализации .NET).
Существуют и другие опции для совместимой сериализации, кроме буферов протокола - Thrift , JSON и YAML приходят на ум, и есть, несомненно, другие.
РЕДАКТИРОВАТЬ: Хорошо, поскольку взаимодействие не так важно, стоит попытаться перечислить различные качества, которые вы хотите из среды сериализации. Одна вещь, о которой вы должны подумать - это управление версиями - это еще одна вещь, которую PB спроектировал так, чтобы хорошо справляться как в обратном, так и в обратном направлении (чтобы новое программное обеспечение могло считывать старые данные и наоборот) - конечно, когда вы придерживаетесь предложенных правил :)
Пытаясь быть осторожным относительно производительности Java по сравнению с нативной сериализацией, я действительно не удивлюсь, обнаружив, что PB все равно быстрее. Если у вас есть возможность, используйте сервер vm - мои последние тесты показали, что виртуальная машина сервера была в два раза быстрее при сериализации и десериализации данных примера. Я думаю, что код PB очень хорошо подходит для JIT виртуальной машины сервера:)
Так же, как примеры показателей производительности, сериализации и десериализации двух сообщений (одно 228 байтов, одно 84750 байтов), я получил эти результаты на своем ноутбуке с использованием виртуальной машины сервера:
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
«Скорость» против «размера» - это оптимизированный сгенерированный код для скорости или размера кода. (Сериализованные данные одинаковы в обоих случаях. Версия "size" предоставляется для случая, когда вы определили много сообщений и не хотите занимать много памяти для кода.)
Как видите, для меньшего сообщения оно может быть очень быстрым - более 500 небольших сообщений сериализуются или десериализуются в миллисекунду . Даже с сообщением 87K на сообщение уходит менее миллисекунды.