Go中的时间HTTP响应

恶魔

在我的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中计算?

icza

编辑:以下答案早于1.7。Go 1.7添加了HTTP跟踪,因此请务必检查以下新答案:在golang中获取TTFB(到第一个字节的时间)值

原始答案如下。


您可以通过打开TCP连接并“说”原始HTTP(维基百科rfc7230rfc7231rfc7232rfc7233rfc7234rfc7235)来进行测量。您建立连接,发送请求,然后在此处启动计时器。并等待响应。这样,您将排除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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Go中的http响应迭代

来自分类Dev

GO中的长时间轮询,服务器未正确响应?

来自分类Dev

经过长时间的HTTP响应

来自分类Dev

如何在NodeJS中测量http.ClientRequest响应时间?

来自分类Dev

在Go中模拟HTTPS响应

来自分类Dev

在Go中解析来自文本文件的HTTP请求和响应

来自分类Dev

有什么方法可以在Go中启用对http2请求和响应的详细跟踪?

来自分类Dev

HTTP响应中的意外内容

来自分类Dev

PHP 5.4中的HTTP响应

来自分类Dev

在Ruby中解析http响应

来自分类Dev

CQRS 中的 HTTP REST 响应

来自分类Dev

在Go中,如何有效地将流式HTTP响应正文写入文件中的搜索位置?

来自分类Dev

在Yesod中记录响应时间

来自分类Dev

确定R中的响应时间

来自分类Dev

Pyomo中的时间延迟响应

来自分类Dev

在Yesod中记录响应时间

来自分类Dev

在mysql中查询平均响应时间

来自分类Dev

使用goroutine时HTTP GET请求的时间响应

来自分类Dev

http和https之间的响应时间差异

来自分类Dev

GridView使用HTTP响应渲染了很长时间

来自分类Dev

GridView用HTTP响应渲染了很长时间

来自分类Dev

当请求时间过长时使用哪个 HTTP 响应代码?

来自分类Dev

github操作中HTTP响应中的空响应主体

来自分类Dev

多个响应。Go中的WriteHeader调用

来自分类Dev

写响应主体等客户在Go中阅读?

来自分类Dev

Go中的XML HTTP Post

来自分类Dev

jQuery-从Promise / Deerred Ajax响应中读取HTTP响应

来自分类Dev

Node.js-到http响应的pipe()导致ubuntu上的响应时间变慢

来自分类Dev

在nodejs http请求中获取响应“ ContentType”