Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jsoup:顶级select()与内部select()的性能_Java_Html Parsing_Jsoup - Fatal编程技术网

Java Jsoup:顶级select()与内部select()的性能

Java Jsoup:顶级select()与内部select()的性能,java,html-parsing,jsoup,Java,Html Parsing,Jsoup,我的理解是,一旦使用Jsoup.parse()将文档加载到Jsoup中,就不再需要解析了,因为一个整洁的层次结构树已经准备好供程序员使用 但我不确定顶级select()是否比内部级别select()更昂贵 例如,如果我们有一个埋在许多嵌套的中,并且该的父级已在程序中可用,那么以下各项之间是否会有性能差异: document.select("p.pclass") 及 ? 这在Jsoup中是如何工作的 更新:根据下面的答案,我了解document.select()和pImediateParent.

我的理解是,一旦使用
Jsoup.parse()
将文档加载到Jsoup中,就不再需要解析了,因为一个整洁的层次结构树已经准备好供程序员使用

但我不确定顶级select()是否比内部级别select()更昂贵

例如,如果我们有一个
埋在许多嵌套的
中,并且该
的父级已在程序中可用,那么以下各项之间是否会有性能差异:

document.select("p.pclass")

?

这在Jsoup中是如何工作的

更新:根据下面的答案,我了解
document.select()
pImediateParent.select()
都使用,只是使用不同的根作为第二个参数:

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


我并不感到惊讶,但现在的问题是
query
如何工作?它是否迭代以查找查询的元素?这是一个随机访问(如在哈希表中)查询吗?

是的,如果使用中间父查询,速度会更快。如果您检查Jsoup源代码,您将看到实际上将
元素本身作为第二个参数委托给该方法。现在,该方法的javadoc表示:

选择 查找与选择器匹配的元素

参数:
  • 查询-CSS选择器
  • 根-要下降到的根元素
返回: 匹配元素,如果不匹配则为空


请注意
root
参数的说明。所以是的,这肯定会有所不同。这并不令人震惊,但有一些不同。

是的,如果使用中间父级,速度会更快。如果您检查Jsoup源代码,您将看到实际上将
元素本身作为第二个参数委托给该方法。现在,该方法的javadoc表示:

选择 查找与选择器匹配的元素

参数:
  • 查询-CSS选择器
  • 根-要下降到的根元素
返回: 匹配元素,如果不匹配则为空


请注意
root
参数的说明。所以是的,这肯定会有所不同。这并不令人震惊,但有一些不同。

谢谢!我更新了上面的问题,添加了对源代码的引用。现在的问题是如何“缓存”中间父级。如果它将在循环中多次用作查询的根(而不是将文档用作根),这实际上可以提高性能,对吗?是的,但这是一个微提升,而不是一个大提升。或者您必须遍历一个大于10MB的超大HTML文档。测量(分析)是知道的。谢谢!我更新了上面的问题,添加了对源代码的引用。现在的问题是如何“缓存”中间父级。如果它将在循环中多次用作查询的根(而不是将文档用作根),这实际上可以提高性能,对吗?是的,但这是一个微提升,而不是一个大提升。或者您必须遍历一个大于10MB的超大HTML文档。测量(分析)就是了解。
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();
}
public static Elements select(String query, Element root)