Vergleich von XSLT-Prozessoren

Stand: März 2011

Um einen ersten Eindruck von der Performanz verschiedener XSLT 2.0-Prozessoren zu erlangen, habe ich einige Prozessoren im Hinblick auf ihre Ausführung einer bestimmten XSLT-Transformation miteinander verglichen (Systeminformationen des verwendeten Rechners: Intel(R) Atom, 1.60GHz, 0.99GB RAM, Microsoft Windows XP Home Edition, Version 2002, SP 3). Der im Folgenden dargelegte Ansatz sollte nicht als repräsentative Untersuchung der Prozessoren verstanden werden, sondern vielmehr als ein erster Einblick in die sich bezüglich ihrer Schnelligkeit sehr heterogen darstellenden Prozessoren. Für verlässliche Aussagen zum genauen Verhalten der verschiedenen Prozessoren bei verschiedenen Aufgabenstellungen, müssten weitere Untersuchungen durchgeführt werden. Folgende Prozessoren wurden miteinander verglichen:

Mit jedem dieser Prozessoren wurden insgesamt 19 XSLT-Transformationen unter Zuhilfenahme von Batch-Dateien von der Kommandozeile aus auf Basis des folgenden Stylesheets durchgeführt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/">
<node>
<xsl:copy-of select="for $node in //* return //*[.=$node]"/>
</node>
</xsl:template>
</xsl:stylesheet>

Dieses Stylesheets erstellt für jedes vorhandene Element in einer XML-Datei eine Tiefenkopie (deep copy), d.h. eine Kopie des Elements inkl. aller seiner Attribute und Nachfahren. Zusätzliche Komplexität für die Kopie des in der Variable $node gespeicherten Kontextknotens entsteht durch das Prädikat [.=$node], welches den Prozessor dazu veranlasst, einen Vergleich aller im Dokument vorhandenen Knoten mit dem Kontextknoten durchzuführen.

Die 19 unterschiedlichen XML-Eingabedateien für die Transformation wurden systematisch erstellt, enthalten jeweils 97 bis 101 Elementknoten, und unterscheiden sich im Hinblick auf die Einbettungstiefe der in ihnen enthaltenen Elemente. Anhand der nachfolgenden vier XML-Dateien kann die Systematik der variierenden Einbettungstiefe nachvollzogen werden. Die erste Zahl des Dokumentnamens gibt hierbei jeweils die Anzahl der direkten Kindelemente des Wurzelelements an, die zweite Zahl die Einbettungstiefe der Nachfahren der direkten Kindelemente des Wurzelelements:

1x100.xml

<node> 
<node>
<node>
<!-- rekursive Einbettung (insg. 101 Elemente), nur ein Blattknoten -->
</node>
</node>
</node>

2x50.xml

<node> 
<node>
<!-- rekursive Einbettung (50 node-Elemente) -->
</node>
<node>
<!-- rekursive Einbettung (50 node-Elemente) -->
</node>
</node>

... 3x33.xml, 4x25.xml, 5x20.xml, 6x16.xml, 7x14.xml, 8x12.xml, 9x11.xml, 10x10.xml, 11x9.xml, 12x8.xml, 14x7.xml, 16x6.xml, 20x5.xml, 25x4.xml, 33x3.xml ...

50x2.xml

<node> 
<node>
<node/>
</node>
<!-- 50 mal obige Struktur, insg. 50 Blattknoten -->
</node>

100x1.xml

<node> 
<node/>
<!-- 100 leere node-Elemente, insg. 100 Blattknoten -->
</node>

Da während der zugrunde liegenden XSLT-Transformation von jedem vorhandenen Element eines XML-Eingabedokuments eine Tiefenkopie erstellt wird, steigt die Größe des Outputs proportional zur Einbettungstiefe der Elemente.

Wie bereits erwähnt, wurden die XSLT-Transformationen mittels Batch-Dateien ausgeführt. Diese haben die jeweiligen Zeiten, welche für die Transformationen benötigt wurden, ermittelt (hier zeigt sich, dass die Vergleichsstudie nur die Schnelligkeit der Prozessoren untersucht. Andere möglicherweise interessante Parameter, wie bspw. der Speicherbedarf, wurden nicht festgehalten) und in Log-Dateien geschrieben, welche später ausgewertet wurden. Die Zeit, welche die verschiedenen XSLT-Prozessoren für die Transformation der jeweiligen XML-Dateien benötigt haben, ist in folgender Grafik und der nachfolgenden Tabelle zusammengefasst:

Dauer von XSLT-Transformationen verschiedener Prozessoren

 

 100x150x233x325x420x516x614x712x811x910x109x118x127x146x165x204x253x332x501x100
SaxonEE 9.2.1.5n 6,2 6,2 6,21 6,26 6,24 6,23 6,53 6,23 6,29 6,3 6,31 6,29 6,33 6,39 6,48 6,52 6,69 6,84 10,67
SaxonPE 9.2.1.5n 6,01 6,03 6,05 6,05 6,1 6,04 6,08 6,08 6,11 6,17 6,17 6,16 6,17 6,22 6,3 6,33 6,46 6,65 9,5
SaxonB 9.1.0.1n 3,86 3,89 3,91 3,95 3,94 3,97 3,96 3,97 4,03 4,11 4,09 4,09 4,19 4,17 4,29 4,45 4,61 5,13 16,69
SaxonEE 9.2.1.5j 3,67 3,74 3,75 3,76 3,82 3,75 3,73 3,75 3,77 3,79 3,85 3,92 3,81 3,8 3,86 3,94 4,04 4,13 5,73
SaxonPE 9.2.1.5j 3,42 3,43 3,42 3,48 3,42 3,44 3,42 3,42 3,49 3,48 3,47 3,49 3,54 3,49 3,54 3,58 3,74 3,87 5,66
SaxonB 9.1.0.3j 1,92 1,92 1,99 1,98 2,02 1,98 1,99 2,04 1,99 2,05 2,04 2,03 2,05 2,05 2,17 2,23 2,38 2,51 3,82
Altova2008 1,32 1,56 1,75 1,98 2,17 2,27 2,48 2,58 2,91 3,11 3,25 3,31 3,81 4,05 5,19 6,47 7,87 11,6 24,69
Altova2011re 0,78 0,89 0,94 1,03 1,12 1,13 1,25 1,29 1,49 1,55 1,64 1,61 1,86 1,98 2,39 2,83 3,64 5,28 13,31
Altova2011ce 0,78 0,88 0,93 1,03 1,13 1,14 1,25 1,3 1,43 1,55 1,6 1,6 1,86 1,94 2,39 2,83 3,64 5,38 13,25
Gestalt 1,22 1,36 1,43 1,58 1,69 1,66 1,82 1,96 2,06 2,2 2,26 2,29 2,53 2,62 3,24 3,73 4,56 6,46 12,59