From: MichaƂ Matczuk Date: Thu, 9 Nov 2023 09:43:26 +0000 (+0000) Subject: net/http: use copyBufPool in transferWriter.doBodyCopy() X-Git-Tag: go1.22rc1~368 X-Git-Url: http://www.git.cypherpunks.ru/?p=gostls13.git;a=commitdiff_plain;h=96eeb4512bd045a2c247f6ebcce46b7e443206e7 net/http: use copyBufPool in transferWriter.doBodyCopy() This is a followup to CL 14177. It applies copyBufPool optimization to transferWriter.doBodyCopy(). The function is used every time Request or Response is written. Without this patch for every Request and Response processed, if there is a body, we need to allocate and GC a 32k buffer. This is quickly causing GC pressure. Fixes #57202 Change-Id: I4c30e1737726ac8d9937846106efd02effbae300 GitHub-Last-Rev: 908573cdbe2e8b6f91ce026cf8632ff5f2c41110 GitHub-Pull-Request: golang/go#57205 Reviewed-on: https://go-review.googlesource.com/c/go/+/456435 Reviewed-by: Damien Neil Reviewed-by: Bryan Mills TryBot-Result: Gopher Robot LUCI-TryBot-Result: Go LUCI Reviewed-by: qiulaidongfeng <2645477756@qq.com> --- diff --git a/src/net/http/transfer.go b/src/net/http/transfer.go index b24998174f..dffff56b31 100644 --- a/src/net/http/transfer.go +++ b/src/net/http/transfer.go @@ -410,7 +410,11 @@ func (t *transferWriter) writeBody(w io.Writer) (err error) { // // This function is only intended for use in writeBody. func (t *transferWriter) doBodyCopy(dst io.Writer, src io.Reader) (n int64, err error) { - n, err = io.Copy(dst, src) + bufp := copyBufPool.Get().(*[]byte) + buf := *bufp + defer copyBufPool.Put(bufp) + + n, err = io.CopyBuffer(dst, src, buf) if err != nil && err != io.EOF { t.bodyReadError = err }