Ich arbeite für ein Projekt mit vielen XSLT-Transformationen. Die Transformationen müssen so schnell wie möglich sein.
Aus Gründen der Lesbarkeit habe ich viele von ihnen geschrieben, die "Geschäftslogik" und "Geschäftslogik" teilten "Ausgabe". Zum Beispiel
%Vor%Natürlich kann dies in einer kompakten Form geschrieben werden
%Vor%Ist die erste Form langsamer als die zweite?
Das Speichern des Ergebnisses einer Funktionsanwendung auf eine Variable hat im allgemeinen Fall keine wesentlichen Auswirkungen auf die Leistung (und einige XSLT-Prozessoren wie Saxon verwenden eine faule Auswertung, also wird die Funktion nicht ausgewertet werden, bis die Variable tatsächlich benötigt wird).
Wenn im Gegensatz dazu die Funktion mehrfach mit denselben Parametern ausgewertet werden muss, kann das Speichern des Ergebnisses in einer Variablen zu führen Effizienz.
Der richtige Weg, um die Leistung zu verbessern, ist :
Profil / Maß zur Ermittlung echter Engpässe.
Optimieren Sie nur die größten Engpässe.
Wenn noch mehr Leistung benötigt wird, starten Sie eine neue Iteration und gehen Sie zu 1. oben.
Um Donald Knuth zu zitieren : Vorzeitige Optimierung ist die Wurzel allen Übels - was eigentlich eine Umschreibung des bekannten Sprichworts ist: " Die Straße zur Hölle ist gepflastert mit guten Absichten. "
Aus einem Abschnitt der XSLT-FAQ :
xsl:variables
sind dynamische Werte. Diese Variablen befinden sich nicht im Cache und werden jedes Mal ausgeführt, wenn sie in XSL referenziert werden. Expliziter Typ Casting von xsl:variable
verbessert die Leistung. Sie können Casting mit den Funktionen string()
und boolean()
ausführen.
Zum Beispiel:
<xsl:variable name="_attr" select="string( /node/child[ @attr ] )">
Verwenden Sie anstelle von Unterelementen Attribute, wo immer dies möglich ist. Die Verwendung von Attributen anstelle von Elementen verbessert die Leistung. Bei der Ausführung von XPath-Übereinstimmungen sind Attribute schneller, da sie nur lose eingegeben werden. Dies erleichtert die Validierung des Schemas.
Wenn Sie mit Attributwerten übereinstimmen, verwenden Sie Aufzählungsattribute. Verwenden Sie mehrere Attributnamen als Bits und legen Sie ihre Werte auf "True" oder "False" fest.
Halten Sie die Quelldokumente klein. Falls erforderlich, teilen Sie das Dokument zuerst auf.
Behalten Sie den XSLT-Prozessor (und Java VM), der zwischen den Läufen
Wenn Sie das gleiche Stylesheet wiederholt verwenden, kompilieren Sie es zuerst.
Wenn Sie dasselbe Quelldokument wiederholt verwenden, behalten Sie es im Speicher.
Wenn Sie dieselbe Umwandlung wiederholt durchführen, tun Sie dies nicht. Speichere stattdessen das Ergebnis.
Halten Sie das Ausgabedokument klein. Wenn Sie beispielsweise HTML generieren, verwenden Sie CSS.
Überprüfe nie dasselbe Quelldokument mehr als einmal.
Teilen Sie komplexe Transformationen in mehrere Stufen.
Vermeide die wiederholte Verwendung von "// item".
Bewerten Sie nicht denselben Knotensatz mehrmals. Speichern Sie es in einer Variablen.
Vermeiden Sie <xsl:number>
, wenn Sie können. Zum Beispiel mit position()
.
Verwenden Sie <xsl:key>
, um beispielsweise Gruppierungsprobleme zu lösen.
Vermeiden Sie komplexe Muster in Vorlagenregeln. Verwenden Sie stattdessen <xsl:choose>
innerhalb der Regel.
Seien Sie vorsichtig, wenn Sie die Achsen preceding[-sibling]
oder following[-sibling]
verwenden. Dies deutet oft auf einen Algorithmus mit n-Quadrat-Leistung hin.
Sortieren Sie nicht denselben Knotensatz mehrmals. Speichern Sie es ggf. als Ergebnisbaumfragment und greifen Sie darauf mit der Erweiterungsfunktion node-set()
zu.
Um den Textwert eines einfachen Elements #PCDATA
auszugeben, verwenden Sie <xsl:value-of>
gegenüber <xsl:apply-templates>
.
Etwas spät zum Spiel, aber ich dachte, ich würde diesen Link teilen: Techniken zur Verbesserung der Leistung von XSL Transformationen .
Tags und Links performance xslt