Особенности производительности XSLT - PullRequest
3 голосов
/ 10 сентября 2011

Я работаю над проектом, в котором используются следующие технологии.Java, XML, XSL

XML широко используется.Довольно часто мне нужно - преобразовать один XML-документ в другой - преобразовать один XML-документ в другой после применения некоторой бизнес-логики.

Все будет встроено в EAR и развернуто на сервере приложений.Поскольку число пользователей огромно, мне нужно учитывать производительность, прежде чем определять стандарты кодирования.

Я не очень большой поклонник XSL, но я пытаюсь понять, является ли использование XSL лучшим вариантом в этом сценарииили я должен придерживаться только Java.Обратите внимание, что у меня есть требования для преобразования XML только в формат XML.У меня нет требований конвертировать XML в какой-либо другой формат, такой как HTML и т. Д.

С точки зрения производительности и управляемости - разве JAVA не является лучшим вариантом, чем использование XLST для преобразований XML в XML?

Ответы [ 4 ]

4 голосов
/ 10 сентября 2011

Из моего предыдущего опыта применения такого рода приложений, если у вас есть узкое место в производительности, то это не будет обработка XSLT.(Единственное исключение может быть, если обработка очень сложна и программист очень неопытен в XSLT.) Могут быть узкие места производительности при разборе или сериализации XML, если вы работаете с большими документами, но они будут применять любую технологию, которую вы используете для преобразования.

Простые преобразования намного проще кодировать в XSLT, чем в Java.Сложные преобразования также обычно проще кодировать в XSLT, если они не используют интенсивное использование функциональности, доступной бесплатно в библиотеке классов Java (примером может быть анализ даты).Конечно, это справедливо только для людей, одинаково комфортно владеющих кодированием на обоих языках.

Конечно, невозможно дать только совет о производительности, пока вы не начнете говорить конкретные цифры.

3 голосов
/ 10 сентября 2011

Я согласен с приведенными выше ответами. XSLT быстрее и лаконичнее в разработке, чем выполнение преобразований в Java. Вы можете изменить XSLT без перекомпиляции всего приложения (просто заново создайте EAR и заново разверните). Ручные преобразования должны быть всегда быстрее, но код может быть намного больше, чем XSLT, благодаря XPATH и другим технологиям, допускающим очень сжатые и мощные выражения. Попробуйте несколько механизмов XSLT (предоставляется java, saxon, xalan ...) и попробуйте отладить и профилировать XSLT, используя такие инструменты, как отдельная среда IDE Altova XMLSpy для обнаружения узких мест. Попробуйте загрузить XSLT-преобразование и повторно использовать его при обработке нескольких XML-файлов, требующих одного и того же преобразования. Другой вариант - скомпилировать XSLT в классы Java, что позволяет быстрее выполнять синтаксический анализ (кажется, что saxon это позволяет), но изменения не так просты, как вам нужно перекомпилировать XSLT и сгенерированные классы.

Мы используем XSLT и XSL-FO для создания счетов для биллингового программного обеспечения. Мы извлекаем данные из базы данных и создаем XML-файл, преобразуем его с помощью XSLT с использованием XSL-FO и обрабатываем полученный XML-код (инструкции FO) для создания PDF-файла с использованием Apache FOP. При создании счетов на нескольких страницах работа выполняется менее чем за секунду в многопользовательской среде и по запросу пользователя (онлайн-обработка). Мы также выполняем пакетную обработку (циклы выставления счетов), и работа выполняется быстрее, чем повторное использование преобразования XSLT. Только для очень больших PDF-документов (> 100 страниц) у нас есть некоторые проблемы (минуты), но самой дорогой задачей всегда является обработка XML с FO на PDF, а не с XML на XML с XSLT.

Как всегда говорилось, если вам требуется больше вычислительной мощности, вы можете просто «добавить» больше процессоров и легко выполнять задания параллельно. Я думаю, что время, сэкономленное с помощью XSLT, если у вас есть некоторый опыт его использования, может быть использовано для покупки большего количества оборудования. Это дихотомия использования мощных инструментов разработки, чтобы сэкономить время разработки и купить больше оборудования или сделать что-то «вручную» для достижения максимальной производительности.

Инструменты интеграции, такие как ESB, в значительной степени основаны на преобразованиях XSLT для адаптации данных XML из одной системы (отправителя) к другой системе (получателю) и обычно могут выполнять сотни «транзакций» (обработка и интеграция данных) в секунду.

2 голосов
/ 10 сентября 2011

Если вы используете современный XSLT-процессор, такой как Saxon (доступен в бесплатной версии), производительность будет довольно хорошей. Кроме того, в долгосрочной перспективе XSL-преобразования будут гораздо более удобными для обслуживания, чем жестко закодированные Java-классы.

(у меня нет связи с авторами саксонской)

1 голос
/ 13 апреля 2017

Вот мое наблюдение, основанное на эмпирических данных. Я широко использую xslt, а во многих случаях в качестве альтернативы для процессоров данных, реализованных в Java. Некоторые из обработчиков данных, которые мы скомпилировали, немного сложнее. В первую очередь мы используем SAXON EE через редактор oxygenxml. Вот что мы заметили с точки зрения производительности преобразования.

Для менее сложных таблиц стилей xsl производительность довольно хорошая (2 секунды, чтобы прочитать файл объемом 30 МБ и сгенерировать более 20 html-страниц с большим количеством структур div). и разница в производительности кажется примерно линейной или меньшей относительно изменения размера файла.

Однако, когда изменяется сложность таблицы стилей xsl, изменение производительности может быть экспоненциальным (тот же файл, с часто вызываемым вызовом функции, вызываемым в шаблоне, с функцией, реализующей простое разрешение xpath, может изменить время обработки, для одного и того же файла, от 2 до 24 с) И кажется, что введение функций и вызовов функций, кажется, является основным виновником. Тем не менее, мы не сделали детального обзора производительности и оптимизации кода. (все еще в альфа-режиме, и производительность все еще в наших пределах - т.е. пакетная работа). Я должен признать, что у нас может быть «злоупотребленная» функция xsl, поскольку во многих местах мы использовали идею абстракции кода в функции (в дополнение к использованию шаблонов). Я подозреваю, что из-за природы, в которой вызываются шаблоны xslt, возможна большая рекурсия в процедурах реализации (для процессора xslt), и вызовы функций могут стать дорогими, если они не оптимизированы. Мы думаем, что изменение «стратегии» в том, как мы пишем наши xsl-скрипты (чтобы быть более ориентированным на XSLT / XPATH), может помочь производительности процессора xlst. Например, использование ключей xsl. так что да, мы, возможно, так же виноваты, как заряженный процессор:)

Еще одна проблема с производительностью - использование памяти. Хотя технически ОЗУ не является проблемой, но простой процессор, увеличивающий с 1 ГБ (!!!) до 6 ГБ для одного вызова / преобразования, не совсем кошерный. Там может быть проблема масштабируемости и емкости (в зависимости от приложения и использования). Это может быть связано не столько с базовым процессором xlst, сколько с инструментом редактора. Это, по-видимому, оказывает огромное влияние на отладку таблиц стилей в реальном времени (т. Е. Пошаговое выполнение xslt).

Несколько замечаний: - командная строка или «производственный» вызов процессора имеет лучшую производительность - для последовательных прогонов (с использованием процессора xslt) первый прогон занимает самое длинное (скажем, 10 с), а последовательные прогоны занимают намного меньше (скажем, 4 с). Снова, возможно, что-то связано со средой редактора.

Тем не менее, хотя производительность процессоров может временами быть проблемой, и в зависимости от требований приложения, я считаю, что если учесть другие факторы, уже упомянутые здесь, такие как сопровождение кода, простота реализации, быстрые изменения размер базы кода, проблемы с производительностью могут быть смягчены или могут быть «приняты» (если конечное приложение все еще может жить с числами производительности) при сравнении реализации с использованием XSLT против Java (или других)

... прощайте! * * 1013

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...