Реализация эффективного обмена информацией в формате XML
Данная работа посвящена проблеме повышения производительности передачи XML сообщений.
XML — текстовый формат, предназначенный для хранения структурированных данных. Стандарт XML занимает лидирующее место в области передачи данных. Основным недостатком XML по сравнению с бинарными стандартами является:
1)Проблема избыточности
2)Ухудшение производительности
Для решения проблемы избыточности XML консорциумом W3C[1] была собрана рабочая группа XML Binary Characterization (XBC)[2], целью работы которой стало исследование различных способов решения проблемы избыточности. По результатам этих исследований EXI[3] продемонстрировал лучшие показатели, как по производительности, так и по сжатию и этот формат был выдвинут на роль кандидата в стандарты[4].
На Рис 1 приведен сравнительный анализ EXI и gzip по сжатию. EXI значительно опережает стандартные алгоритмы сжатия. Таким образом, проблему избыточности можно считать решенной.

Рисунок 1.График сравнения EXI и GZIP по сжатию XML.
Однако в системах реального времени ключевым недостатком XML является п2 – ухудшение производительности.
В рамках работы[7] мной было проведено исследование эффективности имеющейся реализации EXI от компании Agile Delta. Исследование проводилось для программных комплексов систем физической защиты. Характерные сообщения были небольшого размера (200 – 500 байт), при этом эффективность передачи упала на 20-60%.
Под передачей подразумевается сериализация из экземпляра класса в XML сообщение, непосредственная передача по сети и десериализация из XML в экземпляр класса на стороне приемника.
Мне было необходимо решить проблему производительности XML сообщений для описанной выше модели передачи с помощью EXI.Непосредственно требовалось разработать реализацию бинарного кодирования по стандарту EXI, с применением динамической генерации кодеков на основании данных рефлексии класса. Платформа разработки: .Net Framework 3.5.
На Рис 2 представлена диаграмма последовательности разработанной мной библиотеки, для процесса кодирования данных в EXI документ.

Рисунок 2.Диаграмма последовательности
Сначала по типу класса, объект которого впоследствии необходимо сериализовать в EXI документ, создается объект типа EncoderGenerator.После чего, вызывается методы Generate(), этот метод выполняет генерацию кода кодера, в данном случае ClassNameExiEncoder. Пользователь вызывает метод GetStreamData, передавая на вход объект класса и глобальную таблицу значений, в том случае если кодирование идет с применением Exi Fragment Grammer, на выходе получается закодированный документ в виде набора ExiStreamDataElement. ExiStreamDataElement является промежуточной абстракцией и с помощью метода ToStream(outPutStream) преобразуется в бинарный вид.
Я провел ряд тестов на сообщениях типичных для области систем физической защиты.
Измерялось время T = Tсереализации + Tпередачи + Tдесериализации
Ниже привожу результаты. Сообщения по оси абсцисс на диаграмме (Рис. 3) отсортированы по размеру в сторону увеличения.
Тесты на локальном PC.
Характеристики процессора PC: AMD Athlon™ 64 x2 Dual Core Processor 6000+ 3.01Ггц

Рисунок 3. Результаты по эффективности собственной реализации EXI
Тесты по сети
Характеристики процессора приблизительно одинаковы и совпадают с предыдущим пунктом.
Скорость канала передачи примерно 5Мбит/сек.

Рисунок 4. Результаты по эффективности собственной реализации EXI
В результате проделанной работы был получен конечный программный продукт, который реализует задачу бинарного кодирования по стандарту EXI, с применением динамической генерации кодеков на основании данных рефлексии класса, тем самым позволяет использовать классы .Net Framework для передачи сообщений в бинарном EXI представлении. В отличие, от других реализаций полученное решение позволяет более эффективно передавать XML сообщения.
Итогом выполненной работы являются следующие результаты:
• Трафик, генерируемый при передаче данных, снижен в 2-3 раза
• Общая производительность передачи сообщений увеличена в 3-9 раз, в зависимости от структуры сообщения. Прирост производительности зависит от различных факторов. Во-первых, от размера передаваемого сообщения: чем меньше сообщение тем, тем больше увеличивается производительность. Во-вторых, от скорости работы процессора – моя реализация EXI требует меньше вычислений, чем XML, следовательно, на менее производительных машинах EXI работает ещё лучше. В-третьих, от скорости канала передачи, так как EXI – компактное представление XML, то чем ниже скорость канала передачи, тем эффективней EXI.
• Получен способ динамической генерации бинарных стандартов, обладающих как преимуществами XML, так и преимуществами классических бинарных стандартов. Решение проблемы производительности передачи XML сообщений позволяет расширить область применения XML, а так же увеличить производительность уже эксплуатируемых систем.