Как профилировать и оптимизировать XSLT?
У меня есть XSLT для просмотра XML файлов в браузере. XSLT наивно написан и в настоящее время занимает много времени (несколько минут).
Мой XML файл имеет скромный размер (~ 1 MiB), а другие XSLT для одного и того же документа, которые выполняют разные обработки, выполняются намного быстрее. Поэтому я знаю, что проблема не в размере XML, это мой XSLT.
Как мне выполнить профилирование и оптимизацию моего XSLT?
(Неплохо ли делать сложные XSLT в браузере? Должен ли я вместо этого применять XSLT-приложение?)
Ответы
Ответ 1
какой движок XSLT вы используете? Если вы используете движок.NET и Visual Studio, вы можете использовать профилировщик XSLT, интегрированный в Visual Studio, что очень полезно.
Другими превосходными инструментами для профилирования являются Altova XML Spy и Oxygen.
Если вы разместите свой XSLT, вам будет проще рассказать вам, где это возможно, узкие места. В общем, будьте осторожны с выражениями XPath, такими как "//", предшествующие :: * и следующие :: *. Некоторые правила и лучшие практики:
- Избегайте повторного использования
"//item"
. - Не оценивайте один и тот же набор узлов более одного раза; сохраните его в переменной.
- Избегайте
<xsl:number>
если можете. Например, используя position(). - Используйте
<xsl:key>
, например, чтобы решить проблемы группировки. - Избегайте сложных шаблонов в правилах шаблонов. Вместо этого используйте правило.
- Будьте внимательны при использовании
preceding[-sibling]
или following[-sibling]
осей. Это часто указывает алгоритм с n-квадратичной производительностью. - Не сортируйте один и тот же узел несколько раз. При необходимости сохраните его как фрагмент дерева результатов и получите доступ к нему с помощью функции расширения
node-set()
. - Чтобы вывести текстовое значение простого элемента
#PCDATA
, используйте <xsl:value-of>
в предпочтении <xsl:apply-templates>
.
(от http://www.dpawson.co.uk/xsl/sect4/N9883.html#d15756e150)
Следуя этим правилам, как правило, приводит к очень эффективному XSLT, и вам, возможно, не понадобится использовать профилировщик вообще.
Что касается вашего вопроса о XSLT в браузере: я бы не рекомендовал его, потому что сначала вы не независимы от платформы (не каждый браузер может его поддерживать, либо некоторые браузеры могут поддерживать его только с плохо работающим движком), а во-вторых, вы не можете управлять двигатель б/у.
Ответ 2
Если вы предоставляете XSLT-код и XML-документ, на котором вы наблюдаете эту проблему, я и другие люди могут попытаться помочь.
Вот несколько XSLT и советы по повышению производительности от Michael Kay
Восемь советов по эффективному использованию XSLT:
- Храните исходные документы в малом размере. При необходимости сначала разделите документ.
- Храните процессор XSLT (и Java VM), загруженный в память между запусками
- Если вы используете одну и ту же таблицу стилей, сначала скомпилируйте ее.
- Если вы используете один и тот же исходный документ несколько раз, сохраните его в памяти.
- Если вы повторяете одно и то же преобразование, не делайте этого. Сохраните результат вместо этого.
- Сохраняйте выходной документ небольшим. Например, если вы создаете HTML, используйте CSS.
- Никогда не проверяйте один и тот же исходный документ более одного раза.
- Сплит комплексные преобразования на несколько этапов.
Восемь советов по написанию эффективных X SLT:
- Избегайте повторного использования "
//item
".
- Не оценивайте один и тот же node -set более одного раза; сохраните его в переменной.
- Избегайте
<xsl:number>
, если можете. Например, используя position()
.
- Используйте
<xsl:key>
, например, чтобы решить проблемы группировки.
- Избегайте сложных шаблонов в правилах шаблонов. Вместо этого используйте правило
<xsl:choose>
в правиле.
- Будьте осторожны при использовании
preceding[-sibling]
или following[-sibling]
Оси. Это часто
указывает алгоритм с производительностью n
-squared.
- Не сортируйте один и тот же node -set более одного раза. При необходимости сохраните его как
фрагмент дерева результатов
и получить доступ к нему с помощью функции расширения
node-set()
.
- Чтобы вывести текстовое значение простого элемента #PCDATA, используйте
<xsl:value-of>
в предпочтении
до <xsl:apply-templates>
.
Ответ 3
Коммерческий Редактор Oxygen XML имеет функцию профилирования и отладки файлов XSLT. Это хороший редактор XML.
Ответ 4
Мне нравится использовать Altova XMLSpy для компьютеров на базе Windows. Он также имеет встроенный профилировщик. Вы можете проверить видео при использовании редактора. (сканирование до 5:45, чтобы узнать больше о профилировщике). Это коммерческий продукт... с периодом времени:)