From 90c21fa5b6d19fa521023a4b0e8f368b2dc422d7 Mon Sep 17 00:00:00 2001 From: Julien Cretel Date: Sat, 23 Aug 2025 13:10:38 +0000 Subject: [PATCH] net/textproto: eliminate some bounds checks MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This change lifts bounds checks out of loops in the trim function. Here are some benchmark results (no change to allocations): goos: darwin goarch: amd64 pkg: net/textproto cpu: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz │ old │ new │ │ sec/op │ sec/op vs base │ ReadMIMEHeader/client_headers-8 3.531µ ± 3% 3.506µ ± 1% ~ (p=0.068 n=20) ReadMIMEHeader/server_headers-8 2.409µ ± 0% 2.384µ ± 1% -1.02% (p=0.000 n=20) Uncommon-8 545.2n ± 1% 536.7n ± 0% -1.58% (p=0.000 n=20) geomean 1.667µ 1.649µ -1.10% Change-Id: Ia6d4ac516497fd3521122ce9b97173a285b61e12 GitHub-Last-Rev: 580f35afceda1993da70a023ce5c28280bda1ff6 GitHub-Pull-Request: golang/go#75126 Reviewed-on: https://go-review.googlesource.com/c/go/+/698715 Reviewed-by: Cherry Mui Reviewed-by: Tobias Klauser Reviewed-by: Sean Liao Auto-Submit: Sean Liao LUCI-TryBot-Result: Go LUCI Reviewed-by: Carlos Amedee --- src/net/textproto/reader.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/net/textproto/reader.go b/src/net/textproto/reader.go index d375340121..668c06c24c 100644 --- a/src/net/textproto/reader.go +++ b/src/net/textproto/reader.go @@ -110,11 +110,12 @@ func trim(s []byte) []byte { for i < len(s) && (s[i] == ' ' || s[i] == '\t') { i++ } - n := len(s) - for n > i && (s[n-1] == ' ' || s[n-1] == '\t') { + s = s[i:] + n := len(s) - 1 + for n >= 0 && (s[n] == ' ' || s[n] == '\t') { n-- } - return s[i:n] + return s[:n+1] } // ReadContinuedLineBytes is like [Reader.ReadContinuedLine] but -- 2.52.0