为什么Document.html()这么慢?

Sou*_*per 4 performance jsoup

我的印象是Jsoup的API中最昂贵的方法是parse().

但我刚刚发现Document.html()可能更慢.

鉴于它Document是输出parse()(即,这是解析之后),我发现这令人惊讶.

为什么Document.html()这么慢?

Sou*_*per 7

回答自己.所述Element.html()方法被实现为:

public String html() {
  StringBuilder accum = new StringBuilder();
  html(accum); 
  return accum.toString().trim();
}
Run Code Online (Sandbox Code Playgroud)

使用StringBuilder而不是String已经是一件好事了,即使对于一个相对较大的文档,使用StringBuilder.toString()String.trim()可能无法解释它的缓慢性Document.html().

但在中间,我们的方法调用一个重载版本,Element.html(StringBuilder)它循环遍历文档中的所有子节点:

private void html(StringBuilder accum) {
  for (Node node : childNodes)
    node.outerHtml(accum);
}
Run Code Online (Sandbox Code Playgroud)

因此,如果文档包含许多子节点,那么它将很慢.

看看是否可以更快地实现这一点将是有趣的.

例如,如果Jsoup存储通过提供给它的原始 html 的缓存版本.当然,作为一种选择,在内存中保持向后兼容性和小占用空间.Jsoup.parse()