在我的Go程序中,我发出了一些HTTP请求,并且需要计时响应时间(而不是请求时间)。
这是我当前的代码(计时请求时间):
func Get() int {
start := time.Now()
result, err := http.Get("http://www.google.com")
if err != nil {
log.Fatal(err)
}
defer result.Body.Close()
elapsed := time.Since(start).Seconds()
log.Println(elapsed)
return result.StatusCode
}
实际上,这段代码将显示大约5s的请求时间,包括DNS解析和其他内容...如果我使用Apache JMeter之类的工具执行相同的测试,则时间仅为100ms(这是服务器的实际响应时间) ,而无需考虑请求时间)。
我真正想要的是计算服务器的实际响应时间。如何在Go中计算?
编辑:以下答案早于1.7。Go 1.7添加了HTTP跟踪,因此请务必检查以下新答案:在golang中获取TTFB(到第一个字节的时间)值
原始答案如下。
您可以通过打开TCP连接并“说”原始HTTP(维基百科,rfc7230,rfc7231,rfc7232,rfc7233,rfc7234和rfc7235)来进行测量。您建立连接,发送请求,然后在此处启动计时器。并等待响应。这样,您将排除DNS解析和建立连接所需的时间。
由于您不了解服务器是立即开始发送数据还是仅在一切准备就绪时才开始发送数据,并且您没有网络延迟的信息,因此它不是准确的,而仅仅是一种估计。
我将在两点进行测量:何时可以读取第一个字节以及何时读取所有内容:
conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
panic(err)
}
defer conn.Close()
conn.Write([]byte("GET / HTTP/1.0\r\n\r\n"))
start := time.Now()
oneByte := make([]byte,1)
_, err = conn.Read(oneByte)
if err != nil {
panic(err)
}
log.Println("First byte:", time.Since(start))
_, err = ioutil.ReadAll(conn)
if err != nil {
panic(err)
}
log.Println("Everything:", time.Since(start))
笔记:
在第三点进行测量可能是合理的:读取所有响应标头时。检测到这是从响应(连接)中读取整行并遇到空行。此空行将响应头与响应主体分开。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句