怀疑Golang

时间:2015-12-04 09:53:32

标签: 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)conn来自sync.Pool

,可以提高效果

1 个答案:

答案 0 :(得分:0)

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

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

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