2012-07-03 2 views
4

J'étais sous l'impression que la méthode la plus coûteuse dans l'API de Jsoup est parse().Pourquoi Document.html() est-il si lent?

Mais je viens de découvrir que Document.html() pourrait être encore plus lent.

Étant donné que la Document est la sortie de parse() (à savoir c'est après parsing), je trouve cela surprenant. Pourquoi Document.html() est si lent?

Répondre

7

Répondre moi-même. La méthode Element.html() est mis en œuvre:

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

En utilisant StringBuilder au lieu de chaîne est déjà une bonne chose, et l'utilisation de StringBuilder.toString() et String.trim() ne peut pas expliquer la lenteur de Document.html(), même pour un document relativement important.

Mais au milieu, notre méthode appelle une version surchargée, Element.html(StringBuilder) qui fait une boucle par tous les nœuds enfants dans le document:

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

Ainsi, si le document contient beaucoup de nœuds enfants, il sera être lente .

Il serait intéressant de voir s'il pourrait y avoir une implémentation plus rapide de ceci.

Par exemple, si Jsoup stocke une version en cache de la première html qui a été fourni via Jsoup.parse(). En option, bien sûr, pour maintenir la rétrocompatibilité et la petite empreinte dans la mémoire.