设置静态headers,避免分配?
Set static headers, avoid allocation?
我正在尝试编写一个对性能敏感的 Go http 处理程序(特别是我想尽量减少使用的 RAM 量)。处理程序为每个请求设置一堆 headers。所有 headers 始终相同且具有相同的值。
有没有办法对所有 headers 使用单个 const
并在一次调用中设置它们?
例子。而不是对所有请求都这样做:
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
…做这样的事情:
const staticHeaders = `
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Connection: keep-alive`
w.Headers.WriteRaw(staticHeaders)
这可能吗?
你 可以 劫持连接,并直接写入 header,但这只会为你节省一半的 header 分配,因为传入request 仍然会分配一个 map 和 strings 来填充 Request 结构。这也意味着您需要从那时起自己处理原始 TCP 连接。
您应该彻底分析以确保 header 分配实际上是您应用程序的瓶颈。 http 请求的开销比 headers 多得多。
您还可以尝试其他 http 堆栈,例如 github.com/valyala/fasthttp
,它们力求最大限度地减少分配。
我正在尝试编写一个对性能敏感的 Go http 处理程序(特别是我想尽量减少使用的 RAM 量)。处理程序为每个请求设置一堆 headers。所有 headers 始终相同且具有相同的值。
有没有办法对所有 headers 使用单个 const
并在一次调用中设置它们?
例子。而不是对所有请求都这样做:
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
…做这样的事情:
const staticHeaders = `
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Connection: keep-alive`
w.Headers.WriteRaw(staticHeaders)
这可能吗?
你 可以 劫持连接,并直接写入 header,但这只会为你节省一半的 header 分配,因为传入request 仍然会分配一个 map 和 strings 来填充 Request 结构。这也意味着您需要从那时起自己处理原始 TCP 连接。
您应该彻底分析以确保 header 分配实际上是您应用程序的瓶颈。 http 请求的开销比 headers 多得多。
您还可以尝试其他 http 堆栈,例如 github.com/valyala/fasthttp
,它们力求最大限度地减少分配。