Ich möchte die Leistung von xslt verbessern

9

Ich habe ein Framework, das XML basierend auf der HTTP-Anfrage und dem aktuellen Sitzungsstatus generiert. Ich kann in HTML testen, aber Produktionsausgabe wird VXML - vielleicht ein oder zwei "Aromen" aus verschiedenen Gründen.

Hier ist der langsame Teil meines HttpServlet:

%Vor%

Dies dauert derzeit ~ 200ms. Ich möchte, dass es viel schneller geht. Vielleicht & lt; 10ms?

  1. Vorschläge zum Caching? - Da die xsl-Dateien während der Bereitstellung unverändert bleiben, können die Transformer-Objekte unbegrenzt zwischengespeichert werden. Ich denke darüber nach, es in der Session-Ebene zwischenzuspeichern, so dass jede Sitzung (1000 gleichzeitig) ihre eigene hat. Irgendwelche Vorschläge? Sollte ich irgendwelche Frameworks zum Caching verwenden, aus welchen Gründen auch immer?
  2. Gibt es eine schnellere Möglichkeit, das XML in den Antwortstream umzuwandeln?
  3. Soll ich das verwerfen und einen anderen Weg gehen? Wenn Sie den sb.toString bemerkt haben, verwende ich einen StringBuilder, um die XML-Repräsentation der Objekte zu erhalten (Objekte verwenden einen Stringbuilder, um XML-Strings zu erzeugen). Es dauert ungefähr 1 Millisekunde, um das XML-Dokument mit den StringBuildern zu erstellen, daher mache ich mir im Moment keine Gedanken darüber.

Bearbeiten:

Hier ist das XSL-Dokument. Das XML-Dokument ist normalerweise sehr klein. Nur ein paar Elemente. XML-Beispiel befindet sich unter XSL:

%Vor%

Hier ist ein bisschen XML:

%Vor%     
ericp 20.02.2010, 15:37
quelle

3 Antworten

12

Es ist schwierig, Leistungsprobleme zu diagnostizieren, ohne das XSLT zu sehen oder zu wissen, wie groß / komplex XML und XSLT sind.

Sie könnten die Kosten für das Parsing der Datei (en) bezahlen, entweder die XSLT oder die XML und / oder Sie könnten ein sehr ineffizientes XSLT Stylesheet haben.

Zum Beispiel:

  1. Viele // XPATH-Anweisungen, die bei sehr großen XML-Dateien die Leistung beeinträchtigen können.
  2. Logic vergraben innerhalb von Vorlagen , die in das Template @match -Kriterium verschoben werden können. Dies bietet XSLT-Engines die Möglichkeit zur Optimierung.

Es gibt XSLT-Profiler, die Sie verwenden können, um zu sehen, wo Engpässe in Ihrem XSLT sind. Zum Beispiel hat oXygen einen sehr guten Debugger / Profiler :

Wenn Sie die XSLT mehrmals ausführen, sollten Sie cachen das Transformatorobjekt . Auf diese Weise bezahlen Sie nur die Kosten, um sie zu laden und zu instantiieren und sie mehrmals zu verwenden.

Verschieben Sie zum Beispiel die Instanziierung Ihres XSLT Template -Objekts in Ihr Severlet init()

%Vor%

und dann, wo Sie die Transformation durchführen, verwenden Sie das zwischengespeicherte TransformerFactory obj:

%Vor%     
Mads Hansen 20.02.2010, 15:56
quelle
5

Selbst beim Zwischenspeichern liegt der Grund für nicht akzeptable Leistung häufig im XSLT-Code selbst, den Sie gar nicht angezeigt haben.

Nach meiner Erfahrung gab es Fälle, in denen ich eine ineffiziente XSLT-Implementierung so ändern konnte, dass sie tausendfach beschleunigt wurde.

Sehr oft implementiert der Autor einen O (N ^ 2) Algorithmus oder schlechter, wenn ein O (N) oder sogar O (log (N)) Algorithmus existiert.

Geben Sie das zu lösende Problem an und geben Sie den XSLT-Code an, der das Problem löst. Dann könnte es für jemanden möglich sein, Ihnen eine bessere Lösung zu bieten .

    
Dimitre Novatchev 20.02.2010 16:16
quelle
-1

Ich habe ein Tool gefunden, das XSLT-Dateien in den Java-Parsing-Code konvertiert, aber momentan keinen Verweis findet. Sorry für unvollständige Antwort, aber ich bin interessant, es auch zu finden.

    
Dewfy 20.02.2010 15:48
quelle

Tags und Links