gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:34 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com