Java XPath (Apache JAXP-Implementierung) Leistung

HINWEIS: Wenn Sie dieses Problem als gut, bitte upvote es auf Apache-JIRA:

https://issues.apache.org/jira/browse/XALANJ-2540

Ich habe kommen zu einer erstaunlichen Schlussfolgerung, dass diese:

Element e = (Element) document.getElementsByTagName("SomeElementName").item(0);
String result = ((Element) e).getTextContent();

Scheint eine unglaubliche 100x schneller als dies:

//Accounts for 30%, can be cached
XPathFactory factory = XPathFactory.newInstance();

//Negligible
XPath xpath = factory.newXPath();

//Negligible
XPathExpression expression = xpath.compile("//SomeElementName");

//Accounts for 70%
String result = (String) expression.evaluate(document, XPathConstants.STRING);

Ich bin mit dem JVM-Standard-Implementierung von JAXP:

org.apache.xpath.jaxp.XPathFactoryImpl
org.apache.xpath.jaxp.XPathImpl

Bin ich wirklich verwirrt, denn es ist leicht zu sehen, wie JAXP optimieren konnten, die über XPath-Abfrage tatsächlich auszuführen eine einfache getElementsByTagName() statt. Aber es scheint nicht zu tun. Dieses problem beschränkt sich auf etwa 5-6 Häufig verwendete XPath-Aufrufe, sind abstrahiert und verborgen durch eine API. Solche Abfragen beinhalten einfache Pfade (z.B. /a/b/c keine Variablen, Bedingungen) gegen eine immer verfügbare DOM-Dokument nur. Also, wenn eine Optimierung durchgeführt werden kann, wird es sehr einfach zu erreichen.

Meine Frage: Ist XPath ist Langsamkeit eine anerkannte Tatsache, oder bin ich mit Blick auf etwas? Gibt es eine bessere (schnellere) Umsetzung? Oder sollte ich einfach vermeiden XPath-insgesamt, für einfache Abfragen?

InformationsquelleAutor der Frage Lukas Eder | 2011-06-14

Schreibe einen Kommentar