2012-05-14 2 views
1

Использование: Java 1.5/JDOM 1.1.3/Jaxen 1.1.1Когда JDOM XPATH быстрее, чем поиск элементов с помощью getChildren?

тест я написал в том, чтобы подтвердить предположение, что с помощью прекомпилированного XPATH в JDOM было быстрее, чем перебор дочерних элементов. Вместо этого я обнаружил, что XPATH находится между 4 и 5 раз медленнее, чем повторение списков дочерних элементов, выполнение сравнения строк и поиск желаемого.

Для контекста, мой XPath это что-то вроде:

/root/quote/vehicle[@id = 'some vehicle']/coverage[@id = 'some coverage']/code"; 

И фактическая оценка приурочено (в Try/поймать блок):

String element = path.valueOf(doc).getText(); 

И альтернативный поиск:

List<Element> vehicleList = doc.getRootElement() 
             .getChild("quote") 
             .getChildren("vehicle"); 

for(Element vehElement : vehicleList) 
    if(vehElement.getAttributeValue("id").equals("some vehicle")){ 
     List<Element> coverageList = ele.getChildren("coverage"); 
     for(Element covElement : coverageList){ 
      if(covElement.getAttributeValue("id").equals("some coverage")){ 
       element = covElement.getChild("CoverageType").getText(); 
       break; 
      } 
     } 
    } 

Любопытно, что время выполнения метода с использованием XPATH намного медленнее, оно наиболее соответствует более 1000 его ражения.

Первый пример завершен примерно на 0,29 мс + 0,01 мс.

Второй пример завершен где-то между 0,013ms и .002ms.

Оба подходят к очень короткому времени работы, учитывая достаточно длительный тест.

XPath для меня легче писать, однако маршрут getChild выглядит более гибким, но немного подробным. Тем не менее, это профессия, которую я не против делать за скорость. Это также верно, что даже 100 итераций невероятно быстро, так что это может быть академическим ...

В конце концов, я хотел бы знать:

Есть сценарий, где JDOM Xpath быстрее, чем альтернативный стиль показано?

Какие преимущества дает JDom XPath (в любой версии Java/JDOM)?

+0

Вы уже ответили на свои вопросы , – skaffman

+0

Я надеялся получить комментарии от авторитета по этому вопросу :) Я относительно новичок в JDOM. – JHarnach

+0

Эффект jaxen, кажется, регрессировал на протяжении многих лет –

ответ

3

Здесь есть несколько вещей, которые нужно отметить ... Я сделал (я поддерживаю JDOM) обширную работу над JDOM 2.0.1, особенно в отношении производительности оценки XPath. Вот некоторые цифры:

http://hunterhacker.github.com/jdom/jdom2/performance.html

Прочти снизу вверх.

Вот некоторые другие интересные цифры (сравнивает различные версии JDOM с различной Java ВМ)

http://hunterhacker.github.com/jdom/jdom2/performanceJDK.html

'нижней строкой' ....

  • JDOM 2.x вводит быстрее итераторы. Jaxen очень Итератор интенсивный, и улучшения производительности в JDOM 2.x значительны в этом отношении ....
  • Java 7 - это много быстрее, чем предыдущие версии в отношении производительности итератора.
  • Нет никакой пользы для «компиляции» Jaxen XPaths ....
  • даже в лучшие времена, но «родной» метод поиска будет быстрее, чем версия XPath.

Ваш импульс большая производительность будет исходить от работы с Java7, то обновление до JDOM 2.x

Хотя «обычай» поиск, если написано эффективно, всегда будет быстрее, чем XPath.

Edit: Кроме того, JDOM 2.x вводит новый API для запуска XPath запросов, которые вы можете найти легче работать (хотя старый API все еще работает слишком): https://github.com/hunterhacker/jdom/wiki/JDOM2-Feature-XPath-Upgrade

+0

Отличные очки. Все больше и больше этот мой проект требует, чтобы его сняли с устаревшего программного обеспечения, я определенно буду использовать эти ресурсы для моего дела. Благодаря! – JHarnach

+0

rolfl- Я заметил проблему производительности с jdom1 XPath при использовании простого/простого запроса. (пример:/root/child1/sub2/blah, где есть только один узел в документе, который является/root/child1/sub2, и множество «blah» детей этого узла). Посмотрев код jdom, я обнаружил, что в DefaultLocationPath.evaluate (...) он сортирует результаты запроса перед возвратом. Это то, что занимает большую часть времени выполнения. Можете ли вы посоветовать мне, что я могу сделать, чтобы избежать сортировки, которая там происходит? –

+0

Привет Тревор. Правильные люди, которых нужно задавать, - это народ Яксена, а не JDOM. С другой стороны, сортировка во многом опирается на создание итераторов на «родных братьях» (бла). JDOM 2.x имеет более быструю итераторную концепцию, поэтому она быстрее, чем JDOM 1.x. Если вы хотите более подробно обсудить эту деталь, вы должны, вероятно, зарегистрироваться в списке рассылки jdom-интереса или в списке рассогласования jaxen. Это правильные форумы .... – rolfl

Смежные вопросы