aboutsummaryrefslogtreecommitdiff
path: root/src/bytes/bytes.go
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2022-06-15 17:03:27 -0700
committerGopher Robot <gobot@golang.org>2022-08-23 20:26:47 +0000
commit70de482d17863e501be44450f8e60500a6f1b459 (patch)
tree70f6c883081e51acb4535ef440293890d5f10e73 /src/bytes/bytes.go
parent556c978400245b29c3150ba3a53da489d67f3f7e (diff)
downloadgo-70de482d17863e501be44450f8e60500a6f1b459.tar.xz
bytes: rely on utf8.AppendRune
This is both simpler and more performant. WriteRune 23.9µs ± 1% 22.8µs ± 8% -4.43% (p=0.006 n=8+10) ToUpper/longɐstringɐwithɐnonasciiⱯchars 573ns ± 4% 474ns ± 6% -17.27% (p=0.000 n=10+10) ToUpper/ɐɐɐɐɐ 236ns ± 6% 202ns ± 5% -14.12% (p=0.000 n=10+10) ToUpper/a\u0080\U0010ffff 98.8ns ± 6% 91.2ns ± 3% -7.67% (p=0.000 n=10+10) ToLower/LONGⱯSTRINGⱯWITHⱯNONASCIIⱯCHARS 511ns ± 3% 409ns ± 4% -20.02% (p=0.000 n=10+10) ToLower/ⱭⱭⱭⱭⱭ 178ns ± 4% 173ns ± 2% -2.76% (p=0.005 n=10+10) ToLower/A\u0080\U0010ffff 100ns ± 3% 91ns ± 2% -8.55% (p=0.000 n=10+10) Change-Id: I968ef194da2c115cbdcac2d3575c34c65e6a8a56 Reviewed-on: https://go-review.googlesource.com/c/go/+/412337 Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Joseph Tsai <joetsai@digital-static.net> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com> Run-TryBot: Joseph Tsai <joetsai@digital-static.net>
Diffstat (limited to 'src/bytes/bytes.go')
-rw-r--r--src/bytes/bytes.go19
1 files changed, 3 insertions, 16 deletions
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
index 5cf5b477eb..7b28cf1efc 100644
--- a/src/bytes/bytes.go
+++ b/src/bytes/bytes.go
@@ -560,9 +560,7 @@ func Map(mapping func(r rune) rune, s []byte) []byte {
// In the worst case, the slice can grow when mapped, making
// things unpleasant. But it's so rare we barge in assuming it's
// fine. It could also shrink but that falls out naturally.
- maxbytes := len(s) // length of b
- nbytes := 0 // number of bytes encoded in b
- b := make([]byte, maxbytes)
+ b := make([]byte, 0, len(s))
for i := 0; i < len(s); {
wid := 1
r := rune(s[i])
@@ -571,22 +569,11 @@ func Map(mapping func(r rune) rune, s []byte) []byte {
}
r = mapping(r)
if r >= 0 {
- rl := utf8.RuneLen(r)
- if rl < 0 {
- rl = len(string(utf8.RuneError))
- }
- if nbytes+rl > maxbytes {
- // Grow the buffer.
- maxbytes = maxbytes*2 + utf8.UTFMax
- nb := make([]byte, maxbytes)
- copy(nb, b[0:nbytes])
- b = nb
- }
- nbytes += utf8.EncodeRune(b[nbytes:maxbytes], r)
+ b = utf8.AppendRune(b, r)
}
i += wid
}
- return b[0:nbytes]
+ return b
}
// Repeat returns a new byte slice consisting of count copies of b.