2015-12-15 21 views
5

Sto creando una piccola app per misurare quanto tempo occorre caricare un documento HTML, controllando ogni x numero di secondi.Utilizzo di Jsoup connect() in un ciclo. La prima richiesta è sempre molto più lenta di tutte le altre successive

sto usando jsoup in un ciclo:

Connection.Response response = null; 

    for (int i = 0; i < totalGets; i++) { 
     long startTime = System.currentTimeMillis(); 

     try { 
      response = Jsoup.connect(url) 
        .userAgent(USER_AGENT) //just using a Firefox user-agent 
        .timeout(30_000) 
        .execute(); 
     } catch (IOException e) { 
      if (e.getMessage().contains("connect timed out")) { 
       System.out.println("Request timed out after 30 seconds!"); 
      } 
     } 

     long currentTime = System.currentTimeMillis(); 

     System.out.println("Response time: " + (currentTime - startTime) + "ms" + "\tResponse code: " + response.statusCode()); 

     sleep(2000); 
    } 

Il problema che sto avendo è che proprio la prima esecuzione del collegamento jsoup è sempre più lenta di tutte le successive una volta, non importa quale sito web.

Qui è la mia uscita sul https://www.google.com

Response time: 934ms Response code: 200 
Response time: 149ms Response code: 200 
Response time: 122ms Response code: 200 
Response time: 136ms Response code: 200 
Response time: 128ms Response code: 200 

Ecco quello che ottengo sul http://stackoverflow.com

Response time: 440ms Response code: 200 
Response time: 182ms Response code: 200 
Response time: 187ms Response code: 200 
Response time: 193ms Response code: 200 
Response time: 185ms Response code: 200 

Perché è sempre più veloce dopo la prima connessione? C'è un modo migliore per determinare la velocità di caricamento del documento?

+1

Forse questo aiuta: http://stackoverflow.com/questions/16994628/jsoup-seems-to- be-caching-can-i-disable-this – acdhirr

risposta

3

1. Jsoup deve eseguire un codice piastra caldaia prima che la prima richiesta possa essere attivata. Non conterò la prima richiesta nelle tue misure, dal momento che tutte le inizializzazioni annulleranno la prima richiesta.

2. Come menzionato nei commenti, molti siti Web memorizzano le risposte della cache per un paio di secondi. A seconda del sito Web che si desidera misurare, è possibile utilizzare alcuni trucchi per consentire al server Web di creare ogni volta un nuovo sito. Un tale trucco potrebbe essere quello di aggiungere un parametro timestamp. Di solito viene utilizzato lo _ (come http://url/path/?pameter1=val1&_=ts). Oppure puoi inviare senza intestazioni di cache nella richiesta HTTP. tuttavia, nessuno di questi trucchi può forzare un server web a comportarsi nel modo desiderato. Quindi puoi aspettare più di 30 secondi tra ogni richiesta.

+0

Ho finito per ignorare la prima richiesta e ho aggiunto alcune intestazioni per impedire il caching. Grazie! – Andrio

2

Penso che oltre ai punti @luksch ci sia un altro fattore, penso che Java mantenga la connessione in tensione per alcuni secondi, forse risparmiando tempo nei viaggi di protocollo.

Se si utilizza .header("Connection", "close"), verranno visualizzati tempi più uniformi.

È possibile verificare che le connessioni siano mantenute in vita con uno sniffer. Almeno riesco a riutilizzare i numeri di porta (intendo la porta della sorgente, ovviamente).

EDIT:

Un'altra cosa che può aggiungere il tempo alla prima richiesta è la ricerca DNS ...

+0

Vero. Tutte cose che ho dimenticato di menzionare. +1 – luksch