REMARQUE : si vous rencontrez également ce problème, merci de le soumettre à la validation sur Apache JIRA :
J'en suis arrivé à la conclusion étonnante que ceci :
Element e = (Element) document.getElementsByTagName("SomeElementName").item(0);
String result = ((Element) e).getTextContent();
Il semble être incroyablement 100x plus rapide que ça :
// 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);
J'utilise l'implémentation par défaut de JAXP de la JVM :
org.apache.xpath.jaxp.XPathFactoryImpl
org.apache.xpath.jaxp.XPathImpl
Je suis vraiment confus, parce qu'il est facile de voir comment JAXP pourrait optimiser la requête XPath ci-dessus pour exécuter en fait un simple getElementsByTagName()
à la place. Mais il ne semble pas le faire. Ce problème est limité à environ 5-6 appels XPath fréquemment utilisés, qui sont abstraits et cachés par une API. Ces requêtes impliquent des chemins simples (par ex. /a/b/c
sans variables, ni conditions) par rapport à un document DOM toujours disponible uniquement. Donc, si une optimisation peut être faite, elle sera assez facile à réaliser.
Ma question : La lenteur de XPath est-elle un fait reconnu, ou est-ce que je néglige quelque chose ? Existe-t-il une meilleure implémentation (plus rapide) ? Ou devrais-je simplement éviter XPath pour les requêtes simples ?
4 votes
Avez-vous essayé de comparer vos résultats avec ceux d'un compilé réutilisable XPathExpression ?
0 votes
La lenteur est-elle problématique ? Une possibilité est d'évaluer une autre bibliothèque, telle que
jaxen
.0 votes
@McDowell, non. Je vais essayer, merci.
0 votes
@Johan : C'est le cas. En général, ces requêtes ont tendance à prendre 2 à 5 ms par pièce, soit 10 % du temps de requête d'un utilisateur. Nous pensons que cela commence à être problématique, car nous allons utiliser davantage de XPath à l'avenir.
jaxen
pourrait en effet être une option dans le futur...0 votes
@McDowell : La mise en cache de l'expression est négligeable, surtout par rapport à la mise en cache de la fabrique. Mais après quelques re-tests, je dois corriger les temps. La mise en cache de la fabrique accélère d'environ 30%.
0 votes
Pour ceux qui sont intéressés, j'ai ajouté une réponse à la question
0 votes
@Johan, j'ai aussi mesuré
jaxen
. C'est encore pire dans mon cas d'essai, par rapport àsaxon
oxalan
...0 votes
@Lukas, Intéressant. Bon travail pour effectuer le test.
0 votes
@Johan, oui, c'est agréable de savoir qu'après tout, notre choix technologique était le bon, même si
xalan
ressemble à un dinosaure :-)0 votes
@johan,La meilleure performance xpath est vtd-xml, l'avez-vous essayé ?
0 votes
Voir aussi : stackoverflow.com/q/3782618/363573