当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 为什么Document.html()这么慢?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我认为Jsoup的API中最昂贵的方法是 parse(). 但我刚刚发现Document.html()可能会更慢. 鉴于Document是parse()的输出(即,这是在解析之后),我发现这令人惊讶. 为什么Document.html()这么慢? 回答自己
我认为Jsoup的API中最昂贵的方法是 parse().

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

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

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

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

public String html() {
  StringBuilder accum = new StringBuilder();
  html(accum); 
  return accum.toString().trim();
}

使用StringBuilder而不是String已经很好了,使用StringBuilder.toString()和String.trim()可能无法解释Document.html()的缓慢,即使对于相对较大的文档也是如此.

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

private void html(StringBuilder accum) {
  for (Node node : childNodes)
    node.outerHtml(accum);
}

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

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

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

网友评论