diff options
| author | Joe Tsai <joetsai@digital-static.net> | 2022-06-15 17:03:27 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-08-23 20:26:47 +0000 |
| commit | 70de482d17863e501be44450f8e60500a6f1b459 (patch) | |
| tree | 70f6c883081e51acb4535ef440293890d5f10e73 /src/bytes/bytes.go | |
| parent | 556c978400245b29c3150ba3a53da489d67f3f7e (diff) | |
| download | go-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.go | 19 |
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. |
