Подтвердить что ты не робот

Производительность: шаблон call-шаблона и шаблон-шаблон

в обработке XSLT, есть ли разница в производительности между шаблоном заявки и шаблоном вызова? В моих таблицах стилей есть много примеров, где я могу использовать либо, что лучший выбор?

4b9b3361

Ответ 1

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

<xsl:apply-templates> берет последовательность узлов и проходит их по очереди. Для каждого он находит шаблон с наивысшим приоритетом, который соответствует node, и вызывает его. Итак, <xsl:apply-templates> похож на <xsl:for-each> с <xsl:choose> внутри, но более модульным.

Напротив, <xsl:call-template> вызывает шаблон по имени. Там нет изменений в контексте node (no <xsl:for-each>) и нет выбора о том, какой шаблон использовать.

Итак, с точно такими же обстоятельствами, вы можете себе представить, что <xsl:call-template> будет быстрее, потому что он делает меньше работы. Но если вы находитесь в ситуации, когда можно использовать <xsl:apply-templates> или <xsl:call-template>, вы, вероятно, будете делать <xsl:for-each> и <xsl:choose> самостоятельно, в XSLT, а не процессор, делающий это для вас, за кулисами. Поэтому, в конце концов, я предполагаю, что это, вероятно, сбалансирует. Но, как я уже сказал, это сильно зависит от того, какой оптимизатор ваш процессор встал на свои места и точно, какую обработку вы делаете. Измерьте его и посмотрите.

Мои эмпирические правила о том, когда использовать соответствующие шаблоны и когда использовать именованные шаблоны:

  • использовать <xsl:apply-templates> и сопоставлять шаблоны, если вы обрабатываете отдельные узлы для создания результата; если конкретный node должен обрабатываться несколькими различными способами (например, в оглавлении и в теле документа).
  • используйте <xsl:call-template> и именованный шаблон, если вы обрабатываете нечто, отличное от отдельного node, например строки или числа или наборы узлов
  • (в XSLT 2.0) используйте <xsl:function>, если вы возвращаете атомное значение или существующий node

Ответ 2

apply-template и call-template не выполняют одну и ту же задачу, сравнение производительности здесь не очень важно. call-template принимает имя шаблона в качестве параметра, тогда как apply-template принимает выражение xpath. Поэтому шаблон Apply-шаблона намного более эффективен, так как вы не знаете, какой шаблон будет выполнен. Вы получите проблемы с производительностью, если используете сложные выражения xpath. Избегайте "//" в ваших выражениях xpath, поскольку каждый node вашего входного документа будет оценен.

Ответ 3

Это может зависеть от используемого вами анализатора xml. Я не могу говорить ни о чем, кроме анализатора .NET 2003, где я провел некоторые неофициальные тесты производительности на push vs pull XSLT-код. Это похоже на то, что вы спрашиваете: apply-template = push и call-template = pull. Я был убежден, что толчок будет быстрее, но это было не так. Это было ровно.

Извините, у меня сейчас нет точных тестов. Я рекомендую попробовать его с вашим парсером выбора и посмотреть, есть ли какая-либо существенная разница. Моя ставка не будет.