4

JsoupのAPIで最もコストのかかるメソッドはparse()であるという印象を受けました。

しかし、 Document.html()がさらに遅くなる可能性があることを発見しました。

Documentがの出力であることを考えるとparse()(つまり、これは解析です)、これは驚くべきことです。

なぜDocument.html()そんなに遅いのですか?

4

1 に答える 1

7

自分に答える。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()

于 2012-07-04T04:16:02.170 に答える