XSLT Performance - PullRequest
       1

XSLT Performance

7 голосов
/ 22 февраля 2012

Я работаю над проектом, в котором есть много XSLT-преобразований. Преобразования должны быть максимально быстрыми.

Для удобства чтения я написал много из них, разделяющих «бизнес-логику» и "выход". Например

<!-- Business Logic -->
 <xsl:variable name="myLocalVar">
      <xsl:value-of select="func:whateverComputation(params)" />
</xsl:variable>

<!-- more buss logic here -->

<!-- Output -->
<xsl:element name="mytag">
    <xsl:value-of select="$myLocalVar" />
</xsl:element>

Конечно, это можно записать в компактном виде

<xsl:element name="mytag">
      <xsl:value-of select="func:whateverComputation(params)" />
</xsl:element>

Первая форма медленнее , чем вторая?

Ответы [ 3 ]

11 голосов
/ 22 февраля 2012

Из раздела FAQ по XSLT :

Несколько моментов, связанных с производительностью XSLT:

  1. xsl:variables являются динамическими значениями.Эти переменные не находятся в кэше и запускаются каждый раз, когда на них ссылаются в XSL. Явный тип Приведение xsl:variable повышает производительность.Вы можете выполнять приведение типов с помощью функций string() и boolean().

    Например:

    <xsl:variable name="_attr" select="string( /node/child[ @attr ] )">

  2. Вместо использования подэлементов используйте атрибуты везде, где это возможно.Использование атрибутов вместо элементов повышает производительность.При выполнении совпадений XPath атрибуты работают быстрее, потому что они свободно напечатаны.Это облегчает проверку схемы.

  3. При сопоставлении со значениями атрибута используйте атрибуты перечислителя.Используйте несколько имен атрибутов в качестве битов и установите их значения в true или false.

Восемь советов по эффективному использованию XSLT:

  1. Храните исходные документы небольшими.При необходимости сначала разбейте документ.

  2. Сохраняйте процессор XSLT (и Java VM) загруженным в память между запусками

  3. Если вы используете тот женесколько раз, сначала скомпилируйте его.

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

  5. Если вы выполняете то же самоеПреобразование неоднократно, не надо.Вместо этого сохраните результат.

  6. Сохраняйте размер выходного документа небольшим.Например, если вы генерируете HTML, используйте CSS.

  7. Никогда не проверяйте один и тот же исходный документ более одного раза.

  8. Разделите сложные преобразованияв несколько этапов.

Восемь советов о том, как написать эффективный XSLT:

  1. Избегайте повторного использования "//item".

  2. Не оценивайте один и тот же набор узлов более одного раза;сохраните его в переменной.

  3. Избегайте <xsl:number>, если можете.Например, с помощью position().

  4. Используйте <xsl:key>, например, для решения проблем группировки.

  5. Избегайте сложных шаблонов в шаблонеправила.Вместо этого используйте <xsl:choose> в правиле.

  6. Будьте осторожны при использовании осей preceding[-sibling] или following[-sibling].Это часто указывает на алгоритм с n-квадратной производительностью.

  7. Не сортируйте один и тот же набор узлов более одного раза.При необходимости сохраните его как фрагмент дерева результатов и получите доступ к нему с помощью функции расширения node-set().

  8. Чтобы вывести текстовое значение простого элемента #PCDATA, используйте <xsl:value-of>в предпочтении <xsl:apply-templates>.

10 голосов
/ 22 февраля 2012

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

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

Правильный способ повышения производительности: :

  1. Профиль / мера для определенияреальные узкие места.

  2. Оптимизируйте только самые большие узкие места.

  3. Если все еще требуется повышение производительности, начните новую итерацию, перейдя к 1выше.

По словам Дональда Кнута : " Преждевременная оптимизация - корень всего зла " - что на самом деле является перефразировкойВеллкизвестная поговорка: « Дорога в ад вымощена благими намерениями».

2 голосов
/ 25 мая 2015

Немного опоздал к игре, но я решил поделиться этой ссылкой: Методы повышения производительности XSL-преобразований .

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