ПРИМЕЧАНИЕ. Если у вас возникла и эта проблема, пожалуйста, подтвердите ее на Apache JIRA:
Я пришел к удивительному выводу, что это:
Element e = (Element) document.getElementsByTagName("SomeElementName").item(0);
String result = ((Element) e).getTextContent();
Кажется, это невероятно в 100 раз быстрее, чем это:
// 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);
Я использую JVM по умолчанию JAXP:
org.apache.xpath.jaxp.XPathFactoryImpl
org.apache.xpath.jaxp.XPathImpl
Я действительно смущен, потому что легко увидеть, как JAXP может оптимизировать вышеупомянутый запрос XPath, чтобы фактически выполнить простой getElementsByTagName()
. Но, похоже, это не так. Эта проблема ограничена примерно 5-6 часто используемыми вызовами XPath, которые абстрагируются и скрываются API. Эти запросы связаны с простыми путями (например, /a/b/c
, без переменных, условий) против всегда доступного документа DOM. Таким образом, если оптимизация может быть выполнена, ее будет довольно легко достичь.
Мой вопрос: Медленность XPath - это принятый факт, или я что-то не замечаю? Есть ли более эффективная (быстрая) реализация? Или просто я должен просто избегать XPath, для простых запросов?