2015-12-15 4 views
5

Ich erstelle eine kleine App, um zu messen, wie lange ein HTML-Dokument zum Laden braucht, und überprüft jede x Anzahl von Sekunden.Verwenden von Jsoup connect() in einer Schleife. Die erste Anfrage ist immer viel langsamer als alle anderen folgenden

Ich verwende in einer Schleife jsoup:

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); 
    } 

Das Problem, das ich habe, ist, dass die erste Ausführung der jsoup Verbindung ist immer langsamer als alle einmal nachfolgende, egal welche Website.

Hier ist meine Ausgabe auf 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 

Hier ist, was ich bekommen auf 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 

Warum ist es immer schneller nach dem ersten verbinden? Gibt es eine bessere Möglichkeit, die Ladegeschwindigkeit des Dokuments zu ermitteln?

+1

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

Antwort

3

1. Jsoup muss einen Kesselplattencode ausführen, bevor die erste Anforderung ausgelöst werden kann. Ich würde die erste Anfrage nicht in Ihre Messungen einbeziehen, da diese Initialisierung die erste Anforderungszeit verzerrt.

2. Wie in den Kommentaren erwähnt, Cache viele Antworten Antworten für ein paar Sekunden. Abhängig von der Website, die Sie messen möchten, können Sie einige Tricks verwenden, um den Webserver dazu zu bringen, jedes Mal eine neue Seite zu erstellen. Ein solcher Trick könnte darin bestehen, einen Timestamp-Parameter hinzuzufügen. Normalerweise wird _ dafür verwendet (wie http://url/path/?pameter1=val1&_=ts). Oder Sie könnten in der HTTP-Anfrage keine Cache-Header senden. Allerdings kann keiner dieser Tricks einen Webserver zwingen, sich so zu verhalten, wie Sie es möchten. So können Sie länger als 30 Sekunden zwischen jeder Anfrage warten.

+0

Ich endete damit, dass es die erste Anfrage ignoriert und einige Header hinzugefügt, um das Caching zu verhindern. Vielen Dank! – Andrio

2

Ich denke, dass zusätzlich zu @luksch Punkte gibt es einen weiteren Faktor, ich denke, Java hält die Verbindung lebendig für ein paar Sekunden, vielleicht spart Zeit in Protokoll Reisen.

Wenn Sie .header("Connection", "close") verwenden, sehen Sie konsistentere Zeiten.

Sie können überprüfen, ob Verbindungen mit einem Sniffer am Leben erhalten werden. Zumindest kann ich Portnummern (ich meine natürlich Quellport) wiederverwenden.

EDIT:

andere Sache, die Zeit bis zur ersten Anfrage ist DNS-Lookup hinzufügen kann ...

+0

Wahr. Alle Dinge, die ich vergessen habe zu erwähnen. +1 – luksch

Verwandte Themen