XSLT-Leistung
Ich arbeite für ein Projekt, das viele XSLT-Transformationen.
Die Transformationen werden so schnell wie möglich.
Zur besseren Lesbarkeit, die ich schrieb, viele von Ihnen teilen "business-Logik" und
"Ausgang". Zum Beispiel
<!-- Business Logic -->
<xsl:variable name="myLocalVar">
<xsl:value-of select="func:whateverComputation(params)" />
</xsl:variable>
<!-- more buss logic here -->
<!-- Output -->
<xsl:element name="mytag">
<xsl:value-of select="$myLocalVar" />
</xsl:element>
Natürlich kann dies geschrieben werden, in einer kompakten form
<xsl:element name="mytag">
<xsl:value-of select="func:whateverComputation(params)" />
</xsl:element>
Ist die erste form langsamer als der zweite?
- Es gibt keinen Weg, wir können diese Antwort. Wir wissen gar nicht, was XSLT-Prozessor Sie verwenden. Der einzige Weg, um sicher wissen, ist, benchmark-it-yourself. (Auch setzen business-Logik in Ihren Vorlagen an alle, scheint unklug.)
- Ich Stimme mit Avila. Aber bitte beachten Sie das xsl:variable-Deklaration weist einen gemeinsamen Fehler: ändern Sie es zu
<xsl:variable name='x' select='f:comp(params)'/>
. Ich habe gesehen, dies zu ändern, wird auf ein stylesheet geben eine 3-fache Geschwindigkeit-up, nicht zu erwähnen, die den code übersichtlicher und lesbarer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
, Wenn das Ergebnis der Funktion, die Anwendung auf eine variable wird nicht haben einen erheblichen Einfluss auf die Leistung im Allgemeinen Fall (und einige XSLT-Prozessoren wie Saxon verwenden, lazy evaluation, also die Funktion wird nicht ausgewertet, solange bis die variable tatsächlich benötigt wird).
Im Gegenteil, wenn die Funktion ausgewertet werden muss, mehr als einmal mit den gleichen Parametern, speichern das Ergebnis in einer variable kann Folge, die in einigen Fällen deutliche Steigerung der Effizienz.
Der richtige Weg, um die Leistung zu verbessern ist:
Profil/der Maßnahme zu identifizieren, die echte Engpässe.
Optimieren nur die größten Engpässe.
Wenn es noch Bedarf für mehr Leistung, starten Sie eine neue iteration, geht auf 1. oben.
Zitat von Donald Knuth: "Vorzeitige Optimierung ist die Wurzel allen übels" - was ist eigentlich eine paraphrase des bekannten Spruch: "Der Weg zur Hölle ist mit guten Absichten gepflastert."
Aus einem Abschnitt der die XSLT-FAQ:
Paar Punkte im Zusammenhang mit der XSLT-Performance:
xsl:variables
sind dynamische Werte. Diese Variablen werden nicht im cache, und jedes mal ausgeführt, wenn auf Sie verwiesen wird in XSL. Explizite Typ casting vonxsl:variable
verbessert die Leistung. Sie können tun, type-casting mitstring()
undboolean()
Funktionen.Beispiel:
<xsl:variable name="_attr" select="string( /node/child[ @attr ] )">
Anstatt sub-Elemente, Attribute verwenden, wo immer möglich. Über Attribute statt Elementen verbessert die Leistung. Beim ausführen von XPath entspricht, sind Attribute schneller, weil Sie sind lose typisiert. Dies macht die überprüfung des Schemas zu erleichtern.
Beim Spiel gegen Attribut-Werte-enumerator Attribute. Verwenden Sie mehrere Attributnamen als bits, und legen Sie deren Werte auf true oder false.
Acht Tipps für Sie, wie mithilfe von XSLT effizient:
Halten Sie die source-Dokumente klein. Wenn nötig, teilt das Dokument zuerst.
Halten Sie den XSLT-Prozessor (und der Java-VM) in den Speicher geladen, die zwischen läuft
Wenn Sie die gleichen stylesheet-immer wieder, es zuerst kompilieren.
Wenn Sie die gleiche Quelle Dokument wiederholt, halten Sie in Erinnerung.
Wenn Sie die gleiche transformation wiederholt, nicht. Speichern des Ergebnisses statt.
Halten Sie die Ausgabe-Dokument klein. Zum Beispiel, wenn Sie die Erstellung der HTML, Einsatz von CSS.
Nie validieren der gleichen Quelle, Dokument mehr als einmal.
Split komplexe Transformationen in mehrere Phasen.
Acht Tipps für Sie, wie zu schreiben effiziente XSLT:
Vermeiden Sie die wiederholte Verwendung von "//item".
Nicht bewerten, die gleiche node-set mehr als einmal; speichern Sie in einer Variablen.
Vermeiden
<xsl:number>
wenn Sie können. Zum Beispiel, indemposition()
.Verwenden
<xsl:key>
zum Beispiel zu lösen Gruppierung Probleme.Vermeiden Sie komplizierte Muster in das template Regeln. Verwenden Sie stattdessen
<xsl:choose>
innerhalb der Regel.Vorsichtig sein, wenn mit der
preceding[-sibling]
oderfollowing[-sibling]
Achsen. Dies deutet Häufig auf einen Algorithmus mit n-Quadrat-Leistung.Sortieren nicht die gleiche node-set mehr als einmal. Wenn erforderlich, speichern Sie es als ein result tree fragment und für den Zugriff auf die
node-set()
Erweiterung-Funktion.Zur Ausgabe von text mit dem Wert eines einfachen
#PCDATA
Elements<xsl:value-of>
den Vorzug zu<xsl:apply-templates>
.<xsl:variable name="items" select="//items" />
wird das nicht neu bewertet werden, jedes mal?Ein wenig spät, um das Spiel, aber ich dachte, ich Teile diesen link: Verfahren zum Verbessern der Leistung von XSL-Transformationen.