2017-09-06 1 views
-1

Ich versuche sukzessive Ladezeiten einer URL zu messen, konnte aber nicht eine HTTP-Verbindung fallen lassen und mit jeder Messung neu starten. Mit diesem Code ...golang - scheint nicht http Verbindungen fallen lassen

func getloadtime (url string) float64 { 

    // setup client 
    tr := &http.Transport{ 
     DisableKeepAlives: true} 
    client := &http.Client{Transport:tr} 

    // page load and measure 
    start := time.Now() 
    _, _ = client.Get(url) 

    return(time.Since(start).Seconds()) 
} 

func main() { 
    for i := 0; i < 5; i++ { 
     fmt.Println(getloadtime("http://www.google.com")) 
    } 
} 

ich Messungen wie folgt aus:

2.75 
0.13 
0.09 
0.12 
0.115 

So scheint es, die HTTP-Verbindung von der Anfangslast beibehalten wird, da die nachfolgenden Belastungen viel schneller sind. Ich habe auch Einstellung „Connection“ versucht, „Close“ in der Kopfzeile, aber die gleichen Ergebnisse erhalten:

req, err := http.NewRequest("GET", url, nil) 
req.Header.Set("Connection", "close") 
_, _ := client.Do(req) 

Was mache ich falsch?

+2

Sie sind nicht messen, was Sie denken, Sie sind. Ihr erstes Beispiel öffnet nicht nur jedes Mal eine neue Verbindung, sondern es leckt die Verbindungen nach der Rückkehr. Verwerfen Sie nie einen "http.Transport" oder Sie werden Verbindungen verlieren. Was ist das eigentliche Problem, das Sie versuchen zu lösen? – JimB

+0

Ich versuche, konsistente Ergebnisse beim Laden der Seite zu Stresstests zu erhalten (dies ist eine vereinfachte Version - wird letztendlich von mehreren Prozessen sein), also versuche ich jedes Mal eine neue Verbindung zu simulieren/zu erstellen (und schließe sie) richtig). Offensichtlich wird etwas in den Seitenlastmessungen # 2- # 5 innerhalb der Schleife aufrechterhalten. Ich gehe davon aus, dass es die gleiche Verbindung verwendet ... aber ich kann es nicht sagen. –

+0

Es kann unmöglich sein, dieselbe Verbindung zu verwenden, da Sie jedes Mal einen neuen Transport verwenden. Ich nehme an, es ist Ihr Resolver-Cache, der den Unterschied macht. Ermitteln Sie nicht die tatsächlichen Verbindungen. Es gibt auch 'Request.Close', um den Header automatisch zu setzen. – JimB

Antwort

-1

Ich glaube, Sie brauchen die Antwort von dem GET einer Variablen zuweisen und schließen Sie dann die Verbindung mit response.Body.Close()

func getloadtime (url string) float64 { 

    // setup client 
    tr := &http.Transport{ 
     DisableKeepAlives: true} 
    client := &http.Client{Transport:tr} 

    // page load and measure 
    start := time.Now() 
    response, _ := client.Get(url) 
    response.Body.Close() 

    return(time.Since(start).Seconds()) 
} 
+0

Ich habe das versucht .... die gleichen Ergebnisse, aber die erste Messung ist wesentlich länger. –

+0

Oh ok, ich weiß, ich bekomme es, könnte der Hostname die Ursache für die erste länger dauern? Sie können es mit einer IP-Adresse testen und sehen, ob die erste noch mehr Zeit braucht. –

+0

Wenn Sie es richtig machen, müssen Sie zuerst den Fehler überprüfen, und Sie sollten versuchen, den Antworttext zu konsumieren, bevor Sie ihn schließen. Dies hat auch das gleiche Problem wie das Original, wo es Verbindungen aus dem "http.Transport" austreten wird – JimB