web-dev-qa-db-ja.com

パフォーマンス:呼び出しテンプレートと適用テンプレート

xSLT処理で、apply-templateとcall-templateの間にパフォーマンスの違いはありますか?私のスタイルシートでは、どちらかを使用できるインスタンスがたくさんありますが、どちらが最適ですか?

33
Dave Isaacs

すべてのパフォーマンスの質問と同様に、答えは特定の構成(特に、使用しているXSLTプロセッサ)と実行している処理の種類によって異なります。

<xsl:apply-templates>はノードのシーケンスを受け取り、それらを1つずつ通過します。それぞれに対して、ノードと一致する最高の優先順位を持つテンプレートを探し、それを呼び出します。したがって、<xsl:apply-templates><xsl:for-each><xsl:choose>を組み込んだものに似ていますが、よりモジュール化されています。

対照的に、<xsl:call-template>は名前でテンプレートを呼び出します。コンテキストノードに変更はなく(<xsl:for-each>もありません)、使用するテンプレートを選択できません。

したがって、まったく同じ状況で、<xsl:call-template>の方が処理が少ないため、処理が速くなると想像できます。ただし、<xsl:apply-templates>または<xsl:call-template>を使用できる状況では、XSLTで<xsl:for-each>および<xsl:choose>を自分で実行することになるでしょう。プロセッサーの代わりに、舞台裏で行います。結局のところ、それはおそらくバランスが取れると思います。しかし、私が言うように、それはあなたのプロセッサーが配置した最適化の種類と正確にあなたがしている処理に大きく依存します。それを測定して見てください。

一致するテンプレートをいつ使用するか、および名前付きテンプレートをいつ使用するかについての私の経験則は次のとおりです。

  • 個々のノードを処理して結果を作成する場合は、<xsl:apply-templates>および一致するテンプレートを使用します。特定のノードをいくつかの異なる方法で処理する必要がある場合は、モードを使用します(目次とドキュメントの本文など)。
  • 文字列、数値、ノードのセットなど、個々のノード以外のものを処理する場合は、<xsl:call-template>と名前付きテンプレートを使用します
  • (XSLT 2.0)アトミック値または既存のノードを返す場合は<xsl:function>を使用します
58
JeniT

apply-templateとcall-templateは同じタスクを実行しません。パフォーマンスの比較はここでは実際には関係ありません。 call-templateはテンプレート名をパラメーターとして受け取り、apply-templateはxpath式を受け取ります。したがって、適用されるテンプレートは、どのテンプレートが実行されるか本当にわからないため、はるかに強力です。複雑なxpath式を使用すると、パフォーマンスの問題が発生します。入力ドキュメントのすべてのノードが評価されるため、xpath式で「//」を使用しないでください。

10

使用しているxmlパーサーによって異なる場合があります。 .NET 2003パーサー以外は何も言えません プッシュvsプル XSLTコードで非公式のパフォーマンステストを行いました。これは、あなたが求めているものに似ています:apply-template = pushおよびcall-template = pull。プッシュの方が速いと確信していましたが、そうではありませんでした。それはほぼ均一でした。

申し訳ありませんが、現在正確なテストはありません。選択したパーサーで試して、大きな違いがあるかどうかを確認することをお勧めします。私の賭けはないでしょう。

4