Freitag, 10. September 2010


Kolumne

Dienstag, 24. Juli 2007 | Kolumne

Naked XML: Die Entdeckung der Schnelligkeit

(Link zum Artikel: http://www.entwickler.de/jaxenter/kolumnen/037147)

Martin Szugat


XSLT ist nicht eben ein Renner, wenn es um die Verarbeitungsgeschwindigkeit geht. Das hat viele Entwickler davon abgehalten, es in Serveranwendungen einzusetzen, um beispielsweise XML-Daten in HTML-Seiten zu transformieren.

Hartnäckige Vorurteile
Das Argument der Langsamkeit trifft aber weder in der Version 1.0 noch in der Version 2.0 zu, zumindest nicht im Allgemeinen. Denn im Speziellen hängt es von dem jeweiligen XSLT-Prozessor, dem XSLT-Stylesheet und natürlich dem zu verarbeitenden XML-Dokument ab.

Die Verarbeitung eines 1 GB großen Dokuments ist unabhängig vom Format zeitaufwendig, so viel ist klar. Klar ist auch, dass XML-Formate zum Größenwahn neigen. Geeignete Gegenmaßnahmen sind bekannt und können zumindest die Übertragung der XML-Daten und das Parsen derselben beschleunigen.

Selbstverständlich hängt die Verarbeitungsgeschwindigkeit auch davon ab, wie das Stylesheet programmiert ist. Eine Liste immer wieder sequenziell nach bestimmten Werten zu durchsuchen, ist langsam, egal in welcher Programmiersprache. Besser ist die Verwendung einer Hashtable. In XSLT heißt das Zauberwort xsl:key und findet viel zu selten Anwendung.

Der Schlüssel zum Erfolg
Stellen Sie sich ein XML-Dokument vor: es enthält eine Liste von Produkten, denen jeweils ein eindeutiger Bezeichner und ein beschreibender Name zugeordnet sind. Eine zweite Liste im selben Dokument listet die Preise auf, die je nach Land unterschiedlich sind. Ein XSLT-Stylesheet soll einen Produktkatalog für Deutschland erstellen, der neben dem Namen des Produkts auch dessen Preis enthält. Das Stylesheet muss hierfür eine der beiden Listen durchlaufen und sich das jeweils passende Element aus der zweiten Liste besorgen. Hierzu nutzt es den eindeutigen Bezeichner, der als Bindeglied zwischen beiden Listen fungiert.

Bei einem Katalog mit einer Million Einträgen kann diese Aufgabe auf einem Standard-PC durchaus mehrere Minuten Rechenzeit beanspruchen. Der Flaschenhals ist schnell entdeckt: das Durchsuchen der zweiten Liste nach dem jeweils passenden Element (Bezeichner) kostet unnötig viel Zeit, denn der XSLT-Prozessor durchläuft die Liste stets von Anfang zum Ende hin und untersucht dabei Element für Element.

Die Lösung ist einfach:

<xsl:key name="products" match="product" use="@id" />
Dieser Befehl zu Beginn der XSLT-Datei erzeugt eine interne (Hash-)Tabelle namens products, die product-Elemente unter dem Wert ihres id-Attributes indiziert. Auch die Nutzung dieser Tabelle ist denkbar einfach:
<xsl:value-of select="key('products',
current()/@product-id)/@name"/>
Die Funktion key liefert für einen gegebenen Schlüsselwert (im zweiten Parameter) das dazu passende Element aus der jeweiligen Tabelle (deren Name steht im ersten Parameter).

Durch die Verwendung dieses einfachen Mechanismus reduziert sich die Verarbeitungsdauer auf wenige Sekunden. Umso größer die Tabelle ist und umso häufiger sie genutzt wird, umso größer fällt auch der Performancegewinn durch die key-Funktion aus.

Relativismus
Umgekehrt bedeutet dies: bei kleinen Dokumenten und wenig komplexen Stylesheets bringt die Verwendung des key-Elements wenig. Sie kann sogar kontraproduktiv sein – wenn der Aufbau der Tabelle mehr Zeit beansprucht als die lineare Suche.

Bei Webanwendungen gelten zudem verschärfte Regeln: ob eine Transformation in wenigen Sekunden oder in mehreren Minuten stattfindet, spielt schon fast keine Rolle mehr. Der Benutzer erwartet in Bruchteilen von Sekunden eine Antwort. Große XML-Dokumente sind hier also ohnehin tabu. Dementsprechend mager fällt der Performancegewinn durch die geschickte Programmierung des Stylesheets aus.

Als Zeitfresser entpuppt sich vielmehr die Interpretation des Stylesheets, die im schlechtesten Fall bei jeder Anfrage auf das Neue erfolgt. Lösungen sind: die XSLT-Ausgabe in einem Cache vorhalten und/oder das Stylesheet in eine direkt ausführbare Form überführen, sprich kompilieren.

Rückblick und Ausblick
Optimieren und Kompilieren, das sind die beiden Strategien, die zu einem schnelleren XSLT verhelfen. Entscheidend ist also vor allem der XSLT-Prozessor. Um ihn geht es in zweiter Folge zum Thema XSLT und Performance.

Martin Szugat nutzt XSLT oft und gerne, nicht weil es schnell ist, aber weil sich damit schnell Ergebnisse produzieren lassen. Neben XSLT beschäftigt sich der Berater und Fachautor auch mit XQuery, XML Schema und XML in .NET. Zu XML in .NET hält er auch Workshops, unter anderem auf der BASTA und bei der Entwickler-Akademie.

Kommentare

Folgende Links könnten Sie auch interessieren

  • XML, XSLT, Java und JSP  [04.09.2002]
    [http://entwickler.de/zonen/portale/psecom,id,102,buch,128,.html]
  • XML for Bioinformatics  [12.10.2005]
    [http://entwickler.de/zonen/portale/psecom,id,102,buch,454,.html]
  • XSLT Insider  [14.02.2003]
    [http://entwickler.de/zonen/portale/psecom,id,102,buch,167,.html]
  • Content Management mit XML  [17.03.2005]
    [http://entwickler.de/zonen/portale/psecom,id,102,buch,357,.html]
  • Essential XML  [13.08.2002]
    [http://entwickler.de/zonen/portale/psecom,id,102,buch,77,.html]