Строковые представления данных:
- требуется кодирование / декодирование текста (это может быть дешево, но все еще является дополнительным шагом)
- требует сложного кода синтаксического анализа, особенно если существуют удобные для человека правила, такие как «должны разрешать пробелы»
- обычно включает в себя большую полосу пропускания - так больше фактической полезной нагрузки для оттока - из-за встраивания таких вещей, как имена, и (опять же) необходимости иметь дело с удобными для человека представлениями (например, как разбить синтаксис на синтаксис)
- часто требует много экземпляров промежуточных строк, которые используются для поиска членов и т. Д.
Как текстовые, так и двоичные сериализаторы могут быть быстрыми и эффективными (или медленными и ужасными) ... просто: бинарные сериализаторы имеют свои преимущества. Это означает, что «хороший» двоичный сериализатор обычно будет быстрее, чем «хороший» текстовый сериализатор.
Давайте сравним базовый пример целого числа:
JSON:
{"id":42}
9 байт, если мы допустим кодировку ASCII или UTF-8 и не будет пробелов.
XML:
<id>42</id>
11 байт, если мы допустим кодировку ASCII или UTF-8 и не будем использовать пробелы - и не будем слышать шум в пространстве имен, как пространства имен.
Protobuf:
0x08 0x2a
2 байта
Теперь представьте, что вы пишете синтаксический анализатор xml или json общего назначения, а также все неоднозначности и сценарии, которые вам нужно обработать только на текстовом слое , тогда вам нужно сопоставить текстовый токен "id"
с элементом , тогда вам нужно выполнить целочисленный синтаксический анализ "42"
. В protobuf полезная нагрузка меньше, плюс математика проста, и поиск членов является целым числом (поэтому: подходит для очень быстрого switch
/ прыжка).