Почему двоичная сериализация быстрее, чем сериализация XML? - PullRequest
9 голосов
/ 11 октября 2010

Почему двоичная сериализация считается быстрее, чем сериализация xml?

Ответы [ 5 ]

13 голосов
/ 11 октября 2010

Рассмотрим сериализацию double, например:

  • двоичная сериализация: запись 8 байтов из адреса памяти в поток

  • двоичная десериализация: чтение того же8 байтов

  • сериализация xml: запись тега, преобразование в текст, запись закрывающего тега - почти в три раза больше ввода-вывода и в 1000 раз больше загрузка ЦП

  • десериализация xml: чтение / проверка тега, чтение строки с ее разбором по номеру, чтение / проверка закрывающего тега.немного больше накладных расходов на ввод / вывод и еще больше на процессор

9 голосов
/ 11 октября 2010

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

8 голосов
/ 11 октября 2010

Собственно, как и все - зависит от данных, а сериализатор .

Обычно (хотя, возможно, неразумно) люди означают BinaryFormatter для «двоичного», но это имеет ряд недостатков:

  • in добавляет много метаданных типа (которые все занимают место)
  • по умолчанию включает имена полей (которые могут быть подробными, особенно для автоматически реализованных свойств)

И наоборот, xml обычно имеет накладные расходы, такие как:

  • теги с добавлением пробела и IO
  • необходимость разбора тегов (что удивительно дорого)
  • много кодирования / декодирования текста

Конечно, xml легко сжимается, добавляя процессор, но значительно снижая пропускную способность.

Но это не значит, что кто-то быстрее; Я бы сослался на некоторые примеры статистики отсюда (с полным исходным кодом), к которой я аннотировал базу сериализатора (двоичный файл, xml, текст и т. Д.). Посмотрите, в частности, на первые два результата; он выглядит как XmlSerializer превзойденный BinaryFormatter по каждому значению, сохраняя при этом кроссплатформенные преимущества. Конечно, протобуф тогда козыри XmlSerializer; р

Эти цифры довольно хорошо соответствуют тестам ServiceStack, здесь .

BinaryFormatter *** binary
Length: 1314
Serialize: 6746
Deserialize: 6268

XmlSerializer *** xml
Length: 1049
Serialize: 3282
Deserialize: 5132

DataContractSerializer *** xml
Length: 911
Serialize: 1411
Deserialize: 4380

NetDataContractSerializer *** binary
Length: 1139
Serialize: 2014
Deserialize: 5645

JavaScriptSerializer *** text (json)
Length: 528
Serialize: 12050
Deserialize: 30558

(protobuf-net v2) *** binary
Length: 112
Serialize: 217
Deserialize: 250
1 голос
/ 11 октября 2010

Ну, во-первых, XML - раздутый формат.Каждый байт, который вы отправляете в двоичном виде, будет похож на 2 или 3 байта в XML.Например, отправляя число «44» в двоичном виде, вам нужен всего один байт.В XML вам нужен тег элемента плюс два байта для ввода числа: <N>44</N>, что намного больше данных.Одним из отличий является время кодирования / декодирования, необходимое для обработки сообщения.Поскольку двоичные данные настолько компактны, они не будут поглощать много тактов.Если двоичные данные представляют собой фиксированную структуру, вы, вероятно, могли бы загрузить их непосредственно в память и получить доступ к каждому элементу из них без необходимости анализировать / разбирать данные.XML - это текстовый формат, который требует обработки еще нескольких шагов.Во-первых, формат раздутый, поэтому он потребляет больше памяти.Кроме того, все данные являются текстовыми, и вам может понадобиться их в двоичном виде, поэтому необходимо проанализировать XML.Этот анализ все еще требует времени для обработки, независимо от того, насколько быстро работает ваш код. ASN.1 - это формат «двоичного XML», который предоставляет хорошую альтернативу XML, но который необходимо будет анализировать так же, как XML.Кроме того, если большая часть данных, которые вы используете, является текстовой, а не числовой, то двоичные форматы не будут иметь большого значения.Другим фактором скорости является общий размер ваших данных.Когда вы просто загружаете и сохраняете двоичный файл размером 1 КБ или файл XML размером 3 КБ, вы, вероятно, не заметите никакой разницы в скорости.Это связано с тем, что диски используют блоки определенного размера для хранения данных.До 4 КБ легко помещается в большинство дисковых блоков.Таким образом, для диска не имеет значения, нужно ли ему прочитать 1 КБ или 3 КБ, поскольку он читает весь блок 4 КБ.Но когда двоичный файл равен 1 мегабайту, а XML - 3 мегабайта, диск должен будет читать намного больше блоков, чтобы просто прочитать XML.(Или написать это.) И тогда даже имеет значение, если ваш XML составляет 3 МБ или только 2,99 МБ или 3,01 МБ.При передаче по TCP / IP большинство двоичных данных будет кодироваться в UU.Благодаря UU-кодированию ваши двоичные данные будут увеличиваться на 1 байт на каждые 3 байта данных.Данные XML не будут закодированы, поэтому разница в размерах станет меньше, а разница в скорости станет меньше.Тем не менее, двоичные данные все еще будут быстрее, поскольку процедуры кодирования / декодирования могут быть очень быстрыми.В основном, размер имеет значение.:-)Но с XML у вас есть дополнительная альтернатива.Вы можете отправлять и хранить XML в формате ZIP.Microsoft Office делает это с более новыми версиями.Документ Word создается в виде файла XML, но сохраняется как часть большего файла ZIP.Это объединяет лучшее из обоих миров, поскольку документы Word в основном являются текстовыми, поэтому двоичный формат не увеличит скорость.Архивирование XML делает хранение и отправку данных намного быстрее, просто делая их двоичными.Еще интереснее то, что сжатый XML-файл может оказаться меньше несжатого двоичного файла, поэтому сжатый XML-файл становится быстрее.(Но это обман, так как XML теперь бинарный ...)

0 голосов
/ 19 марта 2019

Я предполагал, что двоичная сериализация будет быстрее, чем xml (основываясь на том, насколько многословным может быть xml).Однако у меня есть противоположное наблюдение!Я исследовал проблему с производительностью в одном из моих приложений и обнаружил, что время сериализации одинаково для xml и двоичного файла.Однако разница во времени до десериализации чрезвычайно велика.Десериализация xml занимает менее 10 секунд, но десериализация бинарного процесса занимает более 10 минут!

Так что я предполагаю, что в теории сериализация / десериализация xml медленнее, чем двоичная, но в вашем приложении это зависит!не делятся фактическими данными, но вот результаты (в миллисекундах)

 Serialization   Deserialization    
 XML    Binary   XML    Binary 
 7,956  9,535    9,112  668,918 
 7,608  9,105    8,386  670,445 
 7,583  9,398    8,372  676,190 
 7,656  9,299    9,783  679,117 
 7,454  9,458    8,219  669,626 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...