我认为Jsoup的API中最昂贵的方法是 parse(). 但我刚刚发现Document.html()可能会更慢. 鉴于Document是parse()的输出(即,这是在解析之后),我发现这令人惊讶. 为什么Document.html()这么慢? 回答自己
但我刚刚发现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的缓存版本.当然,作为一种选择,在内存中保持向后兼容性和小占用空间.