Altova XMLSpy 2024 Enterprise Edition

Altova Website: AltovaWebLink XSLT Profiler, XQuery Profiler

Der XSLT/XQuery Profiler ist ein Tool zum Analysieren der Ausführungszeiten von XSLT (1.0 und 2.0) Stylesheets und XQuery-Dokumenten innerhalb von XMLSpy. Er gibt Auskunft darüber, wie lange die Ausführung der einzelnen Anweisungen in einem XSLT Stylesheet oder einem XQuery-Dokument jeweils dauert. Anhand dieser Informationen können Sie die Ausführungsdauer für diese Dateien optimieren.

 

Mit Hilfe des Profilers können Sie die Anweisungen ermitteln, deren Ausführung insgesamt am längsten dauert. Anhand dieser Informationen können Sie die Anweisungen optimieren. Die Ausführung mancher Anweisungen kann aus einem oder mehreren der folgenden Gründe lange dauern:

die Anweisung ist zeitintensiv

die Anweisung wird oft überprüft (hohe Trefferquote)

 

Profilerstellung für Trefferquote und Callgraph

Sie können im Profiler zwischen Trefferquote und Callgraph Profilerstellung auswählen. Bei beiden Profilerstellungsarten wird eine Statistik zur Ausführungszeit der einzelnen Anweisungen angezeigt.

Zu Optimierungszwecken wird normalerweise die Trefferquote-Profilerstellung verwendet. Dabei wird für jede Anweisung im Profiler eine Zeile angezeigt. Bei der Callgraph-Profilerstellung sehen Sie eine Aufzeichnung des Verlaufs der Ausführung der gesamten XSLT-Transformation oder XQuery-Ausführung. Hier sehen Sie, welche Templates/Funktionen während der Transformation aufgerufen werden und in welcher Reihenfolge dies geschieht. Im Ergebnis der Callgraph Profilerstellung wird jedesmal, wenn eine Anweisung aufgerufen wird, eine Zeile angezeigt, anstatt dass für jede Anweisung eine Zeile angezeigt wird.

 

Informationen zur Verwendung des XSLT/XQuery Profilers finden Sie unter Erstellen von XSLT-Profilen oder Erstellen von XQuery-Profilen.

 

Profiler-Ansichten

Die Ergebnisse der Analyse können in einer der folgenden Ansichten angezeigt werden. Klicken Sie dazu auf das entsprechende Register:

Listenansicht: Die Statistik wird in Form einer Liste angezeigt, die z.B. nach Dauer der Anweisungsausführung oder der Dauer der Ausführung der Anweisungen und ihrer untergeordneten Nodes (Nachkommen) sortiert werden kann.

profiler_xslt_listonly

Baumstrukturansicht: Die Statistik wird in Form einer Baumstruktur angezeigt. Sie sehen darin z.B. wie lange für die Ausführung einer Funktion gebraucht wurde. Sie können die Struktur für diese Funktion anschließend erweitert anzeigen lassen und überprüfen, wie viel Zeit die Ausführung der einzelnen Anweisungen in Anspruch nahm und wie oft sie ausgeführt wurden.

profiler_xslt_treeonly

 

Sortieren von Ergebnissen

Nach Ausführung des Profilers können Sie die Ergebnisse nach der Ausführungsdauer der einzelnen Anweisungen oder nach der Anzahl der Aufrufe der Anweisung sortieren.

 

So sortieren Sie die Informationen im Profiler:

1.Klicken Sie auf das Register Liste.

2.Klicken Sie auf den Spaltenkopf der Spalte, nach der die Sortierung durchgeführt werden soll (z.B., Anzahl der Treffer, um nach der Anzahl der Aufrufe einer Anweisung zu sortieren oder Dauer, um nach der Ausführungsdauer der Anweisungen zu sortieren).

 

In diesem Screenshot sehen Sie den Inhalt des Profilers nach Anweisungsdauer in absteigender Reihenfolge sortiert.

profiler_xslt_sorted

 

Optimieren Ihrer XSLT Stylesheets und XQuery-Dokumente

Beachten Sie beim Optimieren der Ausführungsdauer von Anweisungen in XSLT Stylesheets und XQuery-Dokumenten die folgenden Richtlinien:

Verwenden Sie in einer Anweisung nach Möglichkeit keine Variablen, wenn die Variable nur einmal verwendet wird, da die Initialisierung einer Variable zeitaufwändig sein kann.

 

In den folgenden XSLT Code-Fragmenten sehen Sie ein Beispiel, wie man Code durch Entfernen unnötiger Variablen optimieren kann. Beide Beispiele haben dasselbe Ergebnis. Im zweiten Beispiel werden jedoch die Variablen name und containsResult nicht verwendet:

 

       Code-Fragment 1:
<xsl:for-each select="row">
       <xsl:variable name="row" select="."/>
       <xsl:for-each select="@name">
               <xsl:variable name="name" select="."/>
               <xsl:variable name="containsResult" select="fn:contains(\$name, '.exe')"/>
               <xsl:if test="string(\$containsResult)='true'">
               
               ...                
       
               </xsl:if>
       </xsl:for-each>
</xsl:for-each>                                                                                

Im Screenshot unten sehen Sie das Ergebnis der Analyse der Datei, die dieses Codefragment enthält und zwar sortiert nach der Dauer der Ausführung der Anweisungen. Die Anweisung, in der die Variable containsResult initialisiert wird, benötigt etwa 19 Sekunden Gesamtausführungszeit.

profiler_optimize_before

Im Screenshot unten sehen Sie die Ergebnisse in der Baumstruktur. Hier sehen wir, dass die if-Anweisung, die die Variable containsResult verwendet, etwa 50 Sekunden Gesamtausführungszeit benötigt:

profiler_optimize_before_tree

Die XSLT-Transformation dauert insgesamt etwa 74 Sekunden:

profiler_optimize_totaltime1
Code-Fragment 2:
<xsl:for-each select="row">
       <xsl:variable name="row" select="."/>
       <xsl:for-each select="@name">
               <xsl:if test="fn:contains(., '.exe')">
 
               ...
 
               </xsl:if>
       </xsl:for-each>
</xsl:for-each>

 

Nachdem das Stylesheet neu geschrieben wurde, ohne dass diese Variablen verwendet wurden, betrug die Gesamtausführungszeit nur mehr ca. 4,3 Sekunden:

 

profiler_optimize_totaltime2

Verwenden Sie Variablen, wenn ein Wert oder ein Ausdruck mehrmals verwendet wird.

Vermeiden Sie es, lokale Konstanten-Variablen in einer Funktion zu erstellen; erstellen Sie stattdessen globale Konstanten-Variablen.

Vermeiden Sie es, Konstanten-Struktur-Fragmente in einer Funktion zu erstellen; erstellen Sie diese stattdessen global.

Verwenden Sie möglichst wenige Prädikate, da die Filterung mit Prädikaten für jeden Node separat ausgewertet wird. Sie können die Anzahl der Aufrufe von Prädikaten z.B. durch Vorfiltern mit Hilfe von Namen reduzieren. In diesem Beispiel wird bei zwei Prädikaten * verwendet:

 

//*[node-name()=Book][author="Steve"]

 

In dieser Anweisung, die dasselbe Resultat hat, werden der Name Book und nur ein Prädikat verwendet:

 

//Book[@Author="Steve"]

 

Teilen Sie Anweisungen so auf, dass die Teile der Anweisung, die nur einmal ausgeführt werden müssen, nur einmal ausgeführt werden. Erstellen Sie globale Variablen anhand von Teilen, die nur vom globalen Kontext abhängen.

 

© 2017-2023 Altova GmbH