2017-09-06 9 views
-1

URLの連続した読み込み時間を測定しようとしていますが、http接続を切断して各測定で新しく開始できませんでした。このコードでは...golang - 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")) 
    } 
} 

は、私はこのような測定結果を得る:

2.75 
0.13 
0.09 
0.12 
0.115 

だから、その後の負荷がはるかに高速であるため、http接続は、最初の負荷から維持されて表示されます。ヘッダーで「接続」を「閉じる」に設定してみましたが、同じ結果が得られました。

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

私は間違っていますか?

+2

との接続をクローズする必要があると思います。最初の例では毎回新しい接続を開くだけでなく、接続後に接続をリークします。 'http.Transport'を破棄しないでください。そうしないと、接続がリークします。あなたが解決しようとしている実際の問題は何ですか? – JimB

+0

私はストレステスト目的のためにページロードから一貫した結果を得ようとしています(これは単純化されたバージョンです - 最終的には複数のプロセスからのものになります)ので、毎回新しい接続をシミュレート/作成しようとしています正しく)。明らかに、ループ内のペーロード負荷#2-#5に何かが維持されています。私はそれが同じ接続を使用していると仮定しています...しかし、伝えることはできません。 –

+0

毎回新しいトランスポートを使用しているため、同じ接続を使用することはできません。私はそれが違いを生み出すあなたのリゾルバキャッシュだと思います。推測するのではなく、実際の接続を調べます。ヘッダを自動的に設定するための 'Request.Close'フィールドもあります。 – JimB

答えて

-1

私はあなたが変数にGETからのレスポンスを割り当て、その後、あなたはあなたが何を考えて測定していない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

私はこれをやってみました...同じ結果ですが、最初の測定はかなり長くなりました。 –

+0

ああ、私はそれを得ることを知っている、ホスト名を解決することができる最初のものの原因が長くかかる?あなたはIPアドレスでそれをテストし、最初のものがまだ時間がかかっているかどうかを確認することができます –

+0

これを正しく行うには、エラーを最初にチェックする必要があります。これはまた、 'http.Transport'から接続をリークする元のものと同じ問題を抱えています。 – JimB

関連する問題