2017-09-06 87 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

我认为你需要分配从一开始给一个变量响应,然后关闭与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