go - golang中net/http连接源码疑惑

标签 go net-http

我正在学习有关 golang 的源代码,在源代码处为 net/http 中的每个请求创建新连接,例如:

// Create new connection from rwc.
func (srv *Server) newConn(rwc net.Conn) (c *conn, err error) {
    c = new(conn)
    c.remoteAddr = rwc.RemoteAddr().String()
    c.server = srv
    c.rwc = rwc
    c.w = rwc
    if debugServerConnections {
        c.rwc = newLoggingConn("server", c.rwc)
    }
    c.sr.r = c.rwc
    c.lr = io.LimitReader(&c.sr, noLimit).(*io.LimitedReader)
    br := newBufioReader(c.lr)
    bw := newBufioWriterSize(checkConnErrorWriter{c}, 4<<10)
    c.buf = bufio.NewReadWriter(br, bw)
    return c, nil
}

为什么new(conn)在这个地方,从sync.Pool获取conn可以提高性能吗

最佳答案

这个问题是源于衡量应用程序的性能,还是如标题所暗示的那样,源于阅读源代码?性能优化的基本规则是“衡量,不要猜测”(例如,参见 this article)。

除了性能之外,这里不使用 sync.Pool 可能还有一个很好的理由。您需要知道连接在什么时候不再使用并且可以安全地放回池中。

就是说,如果在代码中的哪一点连接需要返回到池中是显而易见的,那么您的建议可能有一些优点。为什么不衡量可以受益的(如果是小的,现实的)应用程序的性能改进?如果真的有显着的好处,可能值得向 Go 社区提出建议。但是,sync.Pool 的主要好处是减少 GC 开销,因此应用程序必须创建许多 连接才能获得显着的好处。

关于go - golang中net/http连接源码疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34085418/

相关文章:

ruby - 在 Ruby 中面对 Net::HTTP Get 的问题

datetime - 确定到期日期是否距离当前日期 12 天

go - 如何使函数的参数是 "generic"结构

templates - Go Template ParseFiles 函数解析多个文件

ruby - 有没有办法使用 set_form 方法在多部分请求中设置 Content-type ?

ruby - 当我尝试访问 Prawn 生成的 PDF 时,为什么 Net::HTTP 超时?

google-app-engine - 将许多 PropertyList 放入 Google App Engine 数据存储区(在 Go 中)并使用 Query.GetAll 再次加载它们

string - 将 "=?UTF 8?.."(RFC 2047) 转换为 golang 中的常规字符串

ruby-on-rails - 在 Rails 中使用 NetHTTP 打 Rails

ruby - 使用 net-http-digest_auth 的未知算法 MD5