it-swarm-pt.tech

Desempenho: modelo de chamada vs modelo de aplicação

no processamento XSLT, existe uma diferença de desempenho entre o modelo de aplicação e o modelo de chamada? Nas minhas folhas de estilo, há muitos casos em que posso usar qual é a melhor escolha?

33
Dave Isaacs

Como em todas as questões de desempenho, a resposta dependerá da sua configuração específica (em particular do processador XSLT que você está usando) e do tipo de processamento que você está executando.

<xsl:apply-templates> pega uma sequência de nós e os percorre um por um. Para cada um, ele localiza o modelo com a maior prioridade que corresponde ao nó e o invoca. Assim <xsl:apply-templates> é como um <xsl:for-each> com um <xsl:choose> por dentro, mas mais modular.

Em contraste, <xsl:call-template> chama um modelo por nome. Não há alterações no nó de contexto (não <xsl:for-each>) e não há escolha sobre qual modelo usar.

Então, exatamente com as mesmas circunstâncias, você pode imaginar que <xsl:call-template> será mais rápido porque está fazendo menos trabalho. Mas se você estiver em uma situação em que <xsl:apply-templates> ou <xsl:call-template> poderia ser usado, você provavelmente fará o <xsl:for-each> e <xsl:choose> você mesmo, em XSLT, em vez de o processador fazer isso por você, nos bastidores. Então, no final, acho que provavelmente será equilibrado. Mas, como eu disse, depende muito do tipo de otimização que seu processador implementou e exatamente do processamento que você está fazendo. Meça e veja.

Minhas regras básicas sobre quando usar modelos correspondentes e quando usar modelos nomeados são:

  • usar <xsl:apply-templates> e modelos correspondentes, se você estiver processando nós individuais para criar um resultado; use modos se um nó específico precisar ser processado de várias maneiras diferentes (como no índice versus o corpo de um documento)
  • usar <xsl:call-template> e um modelo nomeado se você estiver processando algo diferente de um nó individual, como cadeias de caracteres ou números ou conjuntos de nós
  • (no XSLT 2.0) use <xsl:function> se você estiver retornando um valor atômico ou um nó existente
58
JeniT

apply-template e call-template não executam a mesma tarefa, a comparação de desempenho não é realmente relevante aqui. call-template usa um nome de modelo como parâmetro, enquanto apply-template usa uma expressão xpath. O modelo de aplicação é, portanto, muito mais poderoso, pois você realmente não sabe qual modelo será executado. Você terá problemas de desempenho se usar expressões complexas xpath. Evite "//" nas suas expressões xpath, pois todos os nós do seu documento de entrada serão avaliados.

10
Alexandre Victoor

Pode depender do analisador xml que você está usando. Não posso falar em nada além do analisador do .NET 2003, onde fiz alguns testes de desempenho informais no código XSLT Push vs pull . Isso é semelhante ao que você está perguntando: apply-template = Push e call-template = pull. Eu estava convencido de que Push seria mais rápido, mas não era esse o caso. Era quase igual.

Desculpe, não tenho os testes exatos agora. Eu recomendo experimentá-lo com o analisador de sua escolha e ver se há alguma diferença importante. Minha aposta é que não haverá.

4
Andrew Cowenhoven