2012-05-21 12 views
6

Perché HtmlUnit è molto più lento dei browser GUI? Ad esempio, HtmlUnit carica questa pagina http://oltexpress.airkiosk.com/cgi-bin/airkiosk/I7/181002i?O2=2 in 14 secondi (quando il supporto CSS è disattivato) mentre FF lo fa in 5 secondi (dopo aver svuotato la cache, con il supporto CSS). Lo so, i browser moderni non sono così restrittivi che si occupano di codice JS difettoso mentre HtmlUnit è, ma la differenza temporale è qui intollerabile.HtmlUnita più lento del browser GUI?

Qualche idea su come velocizzare il lavoro con HtmlUnit? Qualcuno ha giocato con la cache HtmlUnit?

+0

FF utilizza l'accelerazione GPU per il rendering di [parti di] pagine. – Blender

+0

@Blender È possibile velocizzare la pagina get in htmlUnit? HtmlPage page1 = webClient.getPage (url); – muthu

risposta

5

Per rispondere alla tua domanda sul perché è lento:

questo è puramente perché HtmlUnit ha molte cose in corso contro di essa:

  • E ' in esecuzione in un linguaggio compilato che non ha molte ottimizzazioni native di browser come FireFox.
  • Richiede XML ben formato anziché HTML (non rigido), il che significa che deve convertire l'HTML in XML.
  • Quindi deve eseguire il JavaScript tramite un parser, correggere eventuali problemi con il codice, quindi elaborarlo all'interno di Java stesso.
  • Anche come @Arya ha sottolineato, richiede le cose una alla volta, quindi molti file javascript risulteranno in un rallentamento, molte immagini si tradurranno in un rallentamento.

Per rispondere alla domanda su come accelerarlo:

Come regola generale a disattivare (a meno che non sono necessari):

  • JavaScript
  • Immagini
  • CSS
  • Applet.

Ho anche ricevuto il codice sorgente e rimosso il supporto ActiveX e ricompilato. Se vuoi impedire al codice di caricare quelle pagine extra puoi usare il codice qui sotto per dare una risposta senza scaricarlo dal web.

WebClient browser; 
browser.setWebConnection(new WebConnectionWrapper(browser) { 
    @Override 
    public WebResponse getResponse(final WebRequest request) throws IOException { 
     if (/* Perform a test here */) { 
      return super.getResponse(request); // Pass the responsibility up. 
     } else { 
      /* Give the program a response, but leave it empty. */ 
      return new StringWebResponse("", request.getUrl()); 
     } 
    } 
}); 

Altre cose che ho notato:

  • HtmlUnit non è thread senso di sicurezza che probabilmente si dovrebbe crearne uno nuovo per ogni thread.
  • HtmlUnit realtà non memorizza nella cache le pagine
+0

"Quindi deve analizzare l'intera cosa in oggetti, ogni tag è un oggetto separato (la creazione dell'oggetto è costosa)." & "Quindi deve eseguire il JavaScript tramite un parser, correggere eventuali problemi con il codice, quindi elaborarlo all'interno di Java stesso." - Non sono sicuro, ma penso che anche il browser "normale" lo faccia. grazie per la tua risposta! – biera

+0

Vedo il tuo punto. Stavo solo cercando di far notare che la lingua e le librerie non sono progettate appositamente per l'analisi e l'esecuzione ad alta intensità. – Lee

+0

@Lee È possibile velocizzare la pagina get in htmlUnit? HtmlPage page1 = webClient.getPage (url); – muthu

1

Il motivo per cui richiede più tempo con HTMLUnit è che ciascuna richiesta viene eseguita una alla volta. Questo è il motivo principale per cui ci vuole così tanto tempo per recuperare una pagina. JS e CSS non dovrebbe fare una grande differenza IMO

0

oggetto WebClient mantiene una cache di risorse statiche. Se chiudi un oggetto WebClient e ne crei un altro, devi ricostruire la cache.

Per evitare questo, è possibile riutilizzare l'oggetto WebClient su più sessioni o persino mantenere un pool di oggetti WebClient. Vedi anche se è possibile mantenere un oggetto Cache.Potresti voler cancellare i cookie di WebClient prima di restituirlo al pool.

Come indicato da @Lee, WebConnectionWrapper offre l'opportunità di intercettazione. Lo uso per evitare reindirizzamenti, disabilitare l'esecuzione di JS per risorse selezionate o restituire dati simulati se non mi interessa la risorsa.

Problemi correlati