我正在学习关于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)
在conn
来自sync.Pool
答案 0 :(得分:0)
这个问题是源于测量应用程序的性能还是简单地,如标题所暗示的那样,来源于阅读源代码?性能优化的基本规则是衡量,不要猜测&#34; (例如,参见this article)。
除了性能之外,这里可能没有使用sync.Pool
的充分理由。您需要知道在什么时候连接不再使用,并且可以安全地放回池中。
那就是说,你的建议可能有一些优点,如果代码中的哪个点显然需要将连接返回到池中。为什么不测量可以从中受益的(现实的,如果小的)应用程序的性能改进?如果有一个非常重要的好处,那么可能值得向Go社区提出建议。但是,sync.Pool
的主要好处是减少GC开销,因此应用程序必须创建许多连接才能获得显着的好处。