в обработке XSLT, есть ли разница в производительности между шаблоном заявки и шаблоном вызова? В моих таблицах стилей есть много примеров, где я могу использовать либо, что лучший выбор?
Производительность: шаблон call-шаблона и шаблон-шаблон
Ответ 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. Я был убежден, что толчок будет быстрее, но это было не так. Это было ровно.
Извините, у меня сейчас нет точных тестов. Я рекомендую попробовать его с вашим парсером выбора и посмотреть, есть ли какая-либо существенная разница. Моя ставка не будет.