Go 对戈兰网net/http连接源代码的质疑

Go 对戈兰网net/http连接源代码的质疑,go,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

我正在学习有关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
}
//从rwc创建新连接。
func(srv*Server)newConn(rwc net.Conn)(c*Conn,err error){
c=新(康涅狄格州)
c、 remoteAddr=rwc.remoteAddr().String()
c、 服务器=srv
c、 rwc=rwc
c、 w=rwc
如果调试服务器连接{
c、 rwc=newLoggingConn(“服务器”,c.rwc)
}
c、 sr.r=c.rwc
c、 lr=io.LimitedReader(&c.sr,noLimit)。(*io.LimitedReader)
br:=newBufioReader(c.lr)

bw:=newBufioWriterSize(checkConnErrorWriter{c},4这个问题是源于测量应用程序的性能,还是简单地,正如标题所示,源代码的读取?性能优化的基本规则是“测量,不要猜测”(例如,请参阅)

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


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

应该
sysn.Pool
sync.Pool吗?对不起,这个词错了,它是
sync.Pool
。该结构相对较小,并且保存配置参数/状态,因此,可重用池的好处可能不值得,因为它生成的垃圾量很小。如果每个连接都丢弃4K缓冲区,那么是的,池可能(在基准测试之后!)非常有用。谢谢你的提示!http服务器已经有一个池,在某种意义上说,keepalive,它尽可能多地重用连接。另外,当GC可以更有效地为你做这件事时,通常不值得在这样的结构中为零清除所有字段。谢谢你的提示。我对golang很熟悉。它似乎知道一个t根据我在
http/server.go
第1365行的源代码中看到的,连接不再使用的点是什么:
w.finishRequest()
,但我不知道你是否真的这么做了。不客气。阅读围棋标准库是熟悉围棋惯用代码的好方法。如果你想在围棋中学习一本好的教科书,我推荐。值得订阅-定期包括有趣的文章和视频。是的,我订阅了围棋时事通讯。