четверг, 4 марта 2010 г.

[prog] О скорости упаковки/распаковки XML

Многие знают, а некоторые еще только догадываются, что использование XML для передачи данных – штука недешевая. Скорость упаковки/распаковки XML в несколько раз меньше различных форм бинарной сериализации. Но вот во сколько раз?

По работе пришлось заняться этим вопросом и вот что удалось с ходу найти в Интернете:

An XML Alternative for Performance and Security: ASN.1 – небольшая статья от 2004 года, в которой сравниваются скорости работы ASN.1 и XML. В некоторых случаях скорость декодирования XML на 1000% медленнее скорости декодирования ASN.1 (речь, насколько я понял, идет о подписанных сообщениях).

Use of ASN.1 Encoding Rules for Binary XML – 37-ми страничная презентация от Objective Systems Inc., в которой приводятся результаты нескольких замеров производительности. Впечатлил такой результат: на сериализацию 10000 сообщений (объем в ASN.1 BER – 125 байт, объем в XML – 868 байт) потребовалось: для ASN.1 BER – 53 миллисекунды, для XML – 139 миллисекунд. А для десериализации: ASN.1 BER – 58 миллисекунд, тогда как для XML – 1228 миллисекунд.

Investigating Performance of XML Web Services in Real-Time Business Systems – практически совсем свежая статья о том, какие существенные накладные расходы привносит XML-формат в SOA и как можно с этим бороться.

Сам я сегодня провел маленький эксперимент по моделированию своей задачи: некий узел должен принимать несколько тысяч сообщений типа A и формировать несколько тысяч сообщений типа B. Так вот у меня для двоичного формата (по принципам TLV из ASN.1 BER) получалось время ~40 миллисекунд. А для XML-формата – ~250 миллисекунд (в качестве XML движка использовалась библиотека POCO, не исключено, что с libxml2 время было бы меньше). Что интересно, в моем случае сериализация XML потребляла больше времени, чем десериализация (возможно, из-за слишком тривиальной реализации теста).

Если у кого-то есть ссылки на аналогичные сравнения скорости XML и других форматов, поделитесь пожалуйста.

Так же я разыскиваю замеры производительности (в особенности сравнения производительности) различных message-oriented middleware продуктов (вроде IBM WebSphere MQ, SonicMQ, FUSE Message Broker, TIBCO Rendezvous, FioranoMQ и т.д.) Был бы признателен за помощь в поиске публично доступных материалов на эту тему.

4 комментария:

Quaker комментирует...

Помимо ASN.1 и XML есть еще JSON
(http://en.wikipedia.org/wiki/JSON). Говорят, что он несколько полегче и пошустрее XML будет (за счет отсутствия закрывающих тегов).

eao197 комментирует...

Ну кроме JSON-а есть еще и YAML (http://en.wikipedia.org/wiki/YAML), XDR (http://en.wikipedia.org/wiki/External_Data_Representation), BEEP (http://en.wikipedia.org/wiki/BEEP) и куча всего прочего (http://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats).

Проблема в том, что в определенных кругах XML -- это де-факто стандарт и вопрос ставится в виде XML vs что-бы-то-ни-было-еще.

yuha комментирует...

Разные движки XML очень серьезно по скорости работы различаются. Например с RapidXml, возможно, скорость не будет столь драматично уступать.

eao197 комментирует...

Ну моя реализация TLV так же никогда под скорость не оптимизировалась. Просто интуитивно понятно, что в XML накладные расходы больше как раз счет текста, так и за счет закрывающих тегов, так и за счет всяких DTD/XSD и пр.

А все упомянутые выше тесты данную интуитивность просто подтверждают имхо.

PS. В презентации Use of ASN.1 Encoding Rules... есть слайд со сравнением скорости различных XML движков (стр.27).