Производительность: шаблон вызова против шаблона применения - PullRequest
32 голосов
/ 17 сентября 2008

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

Ответы [ 3 ]

57 голосов
/ 17 сентября 2008

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

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

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

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

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

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

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

4 голосов
/ 17 сентября 2008

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

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

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