我正在学习有关 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/