2015-05-04 4 views
1

У меня есть Java-программа, которая заботится об эффективности. Там я использую XPaths.Каков наиболее эффективный способ обращения к элементу в XPath?

В XPath можно выбрать элементы, начиная от корня

/root/a/b/c/d/e 

или использовать descendent-or-self ось:

//e 

Что будет наиболее эффективным методом среди этих двух?

ответ

3

прямой путь будет иметь тенденцию работать лучше, чем один, используя более общий потомок-или-сам (//) оси, однако:

  • Реализации может изменяться (но, как правило, прямые дорожки работать лучше).
  • Разница может быть незначительной, чтобы не иметь значения, особенно для небольших документов.
  • Как и во всех проблемах с производительностью, измерьте перед оптимизацией, чтобы избежать затрачиваемого усилия в областях, отличных от настоящих узких мест.
+1

В конкретном случае _leading_ '//' Я бы не удивился, если бы многие процессоры могли оптимизировать это для одного поиска в хэш-таблице. Конечная пуля определенно является ключом - не угадывайте, _measure_. –

1

Я бы предположил, что/root/a/b/c/d/e будет более эффективным, поскольку в первом случае процессор XPath может устранить множество ветвей, тогда как во втором случае (//e) процессор XPath должен искать все дерево документов.

Вы должны написать небольшую программу Java, которая извлекает два разных способа, а затем посмотреть, сколько времени потребуется, чтобы запустить 1000 циклов.

1

Понимание ведущих конструкций / и // очень важно.

Ведущий / начинает путь, который всегда относится к корневому узлу. Поэтому, даже если мы ищем суб-узел, в XPath:

root/a/b/c 

... будет возвращать каждый c узел в документе XML, даже если они не являются потомками первого c узла. Аналогично, XPath:

//e/ 

... будет возвращать каждый e узел в документе XML, а не только потомки первого c узла.

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