2017-09-06 1 views
-1

J'essaie de mesurer les temps de chargement successifs d'une URL, mais je n'ai pas pu supprimer une connexion http et recommencer à zéro à chaque mesure. Avec ce code ...golang - impossible de supprimer les connexions http

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

Je reçois des mesures comme ceci:

2.75 
0.13 
0.09 
0.12 
0.115 

donc il semble que la connexion HTTP est maintenue de la charge initiale étant donné que les charges suivantes sont beaucoup plus rapides. J'ai aussi essayé de placer « Connexion » à « Fermer » dans l'en-tête, mais obtenir les mêmes résultats:

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

Qu'est-ce que je fais mal?

+2

Vous n'êtes pas la mesure de ce que vous pensez que vous êtes. Non seulement votre premier exemple ouvre une nouvelle connexion à chaque fois, mais il fuit les connexions après le retour. Ne jetez jamais un 'http.Transport', sinon vous ferez des connexions. Quel est le problème que vous essayez de résoudre? – JimB

+0

J'essaie d'obtenir des résultats cohérents de la charge de la page à des fins de test de stress (il s'agit d'une version simplifiée qui proviendra de plusieurs processus), j'essaie donc de simuler/créer une nouvelle connexion à chaque fois correctement). Il est clair que quelque chose est maintenu dans les mesures de pageload # 2- # 5 dans la boucle. Je suppose qu'il utilise la même connexion ... mais je ne peux pas le dire. –

+0

Il est impossible d'utiliser la même connexion, car vous utilisez un nouveau Transport à chaque fois. Je suppose que c'est votre cache de résolution qui fait la différence. Plutôt que de deviner, inspectez les connexions en cours. Il y a aussi un champ 'Request.Close' pour définir l'en-tête automatiquement. – JimB

Répondre

-1

Je pense que vous devez affecter la réponse de l'EEG à une variable puis fermer la connexion avec 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

J'ai essayé ceci .... même résultat cependant, la première mesure est sensiblement plus longue. –

+0

Oh ok, sais que je comprends, pourrait résoudre le nom d'hôte la cause de la première à prendre plus de temps? Vous pouvez le tester avec une adresse IP et voir si le premier prend encore plus de temps –

+0

Si vous allez le faire correctement, vous devez d'abord vérifier l'erreur, et vous devriez essayer de consommer le corps de la réponse avant de le fermer. Cela a également le même problème que l'original où il va fuir les connexions de la 'http.Transport' – JimB