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();
}
Stringの代わりにStringBuilderを使用することはすでに良いことであり、比較的大きなドキュメントであっても、とを使用してもStringBuilder.toString()
のString.trim()
速度の遅さを説明できない場合があります。Document.html()
しかし、途中で、このメソッドはオーバーロードされたバージョンを呼び出します。Element.html(StringBuilder)
これは、ドキュメント内のすべての子ノードをループします。
private void html(StringBuilder accum) {
for (Node node : childNodes)
node.outerHtml(accum);
}
したがって、ドキュメントに多数の子ノードが含まれていると、処理速度が低下します。
これをより高速に実装できるかどうかを確認するのは興味深いことです。
たとえば、Jsoupが。を介して提供された生のhtmlのキャッシュバージョンを保存している場合。もちろん、オプションとして、下位互換性とメモリ内の小さなフットプリントを維持します。Jsoup.parse()