Jsoup: производительность select() верхнего уровня по сравнению с select() внутреннего уровня

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

Но что я не уверен, является ли выбор верхнего уровня () более дорогостоящим, чем выбор внутреннего уровня ().

Например, если у нас есть <p>, спрятанный внутри множества вложенных <div>, а родитель этого <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 работает? Итерирует ли он поиск запрошенного элемента? Это запрос произвольного доступа (как в хеш-таблице)?


person Regex Rookie    schedule 19.10.2011    source источник


Ответы (1)


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

Выбрать

public static Elements select(String query, Element root)

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

Параметры:

  • запрос - селектор CSS
  • root - корневой элемент, чтобы спуститься в

Возвращает:

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

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

person BalusC    schedule 20.10.2011
comment
Спасибо! Я обновил свой вопрос выше, чтобы добавить ссылки на исходный код. Теперь вопрос касается ROI кэширования промежуточного родителя. Если он будет использоваться в качестве корня запроса много раз в цикле (по сравнению с использованием документа в качестве корня), это действительно может повысить производительность, верно? - person Regex Rookie; 20.10.2011
comment
Да, но это микробуст, а не мегабуст. Или вы, должно быть, просматриваете необычайно большой HTML-документ размером более 10 МБ или около того. Измерение (профилирование) есть знание. - person BalusC; 20.10.2011