Jsoup: Производительность выбора верхнего уровня () против выбора внутреннего уровня () - PullRequest
1 голос
/ 20 октября 2011

Насколько я понимаю, когда документ загружается в Jsoup с использованием Jsoup.parse(), синтаксический анализ снова не требуется, поскольку аккуратное иерархическое дерево готово для использования программистом.

Но я не уверен, что верх-level select () является более дорогостоящим, чем select на внутреннем уровне. (*).

Например, если у нас есть <p>, похороненный во многих вложенных <div> s, и родительский элемент <p> являетсяуже доступно в программе, будет ли любая разница в производительности между:

document.select("p.pclass")

и

pImediateParent.select("p.pclass")

?

Как это работаетв Jsoup?

ОБНОВЛЕНИЕ: Основываясь на ответе ниже, я понимаю, что и document.select() и pImediateParent.select() используют одинаковый точный статический метод , только сдругой корень в качестве второго параметра:

public Elements select(String query) {
    return Selector.select(query, this);
}

Который переводит в :

/**
 * Find elements matching selector.
 *
 * @param query CSS selector
 * @param root  root element to descend into
 * @return matching elements, empty if not
 */
public static Elements select(String query, Element root) {
    return new Selector(query, root).select();
}

Я не удивлен, но теперь вопрос в том, как это сделать query Работа?Итерирует ли он, чтобы найти запрашиваемый элемент?Это запрос произвольного доступа (как в хэш-таблице)?

1 Ответ

1 голос
/ 20 октября 2011

Да, это будет быстрее, если вы используете промежуточного родителя. Если вы проверите исходный код Jsoup, вы увидите, что Element#select() фактически делегирует методу Selector#select() с самим Element в качестве второго аргумента. Теперь Javadoc этого метода говорит:

выберите

public static Elements select(String query, Element root)

Найти элементы, соответствующие селектору.

Параметры:

  • запрос - CSS селектор
  • root - корневой элемент для перехода в

Возвращает:

соответствующие элементы, пустые, если нет

Обратите внимание на описание параметра root. Так что да, это определенно имеет значение. Не шокирует, но есть некоторая разница.

...