mirror of
https://github.com/golang/go
synced 2024-11-24 23:57:57 -07:00
unicode/utf8: speedup RuneCount
CL 612617 did speedup RuneCountInString, thus we can now use it to speedup RuneCount, too. name old time/op new time/op delta RuneCountTenASCIIChars-8 8.69ns ± 1% 3.59ns ± 2% -58.66% (p=0.000 n=9+9) RuneCountTenJapaneseChars-8 49.8ns ± 2% 40.9ns ± 0% -17.94% (p=0.000 n=10+8) Change-Id: I311750c00efc79af35fb0ca3b482a5d94e0a7977 Reviewed-on: https://go-review.googlesource.com/c/go/+/612955 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Tim King <taking@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
9bd34ebb7e
commit
3d33437c45
@ -414,35 +414,11 @@ func appendRuneNonASCII(p []byte, r rune) []byte {
|
|||||||
func RuneCount(p []byte) int {
|
func RuneCount(p []byte) int {
|
||||||
np := len(p)
|
np := len(p)
|
||||||
var n int
|
var n int
|
||||||
for i := 0; i < np; {
|
for ; n < np; n++ {
|
||||||
n++
|
if c := p[n]; c >= RuneSelf {
|
||||||
c := p[i]
|
// non-ASCII slow path
|
||||||
if c < RuneSelf {
|
return n + RuneCountInString(string(p[n:]))
|
||||||
// ASCII fast path
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
x := first[c]
|
|
||||||
if x == xx {
|
|
||||||
i++ // invalid.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
size := int(x & 7)
|
|
||||||
if i+size > np {
|
|
||||||
i++ // Short or invalid.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
accept := acceptRanges[x>>4]
|
|
||||||
if c := p[i+1]; c < accept.lo || accept.hi < c {
|
|
||||||
size = 1
|
|
||||||
} else if size == 2 {
|
|
||||||
} else if c := p[i+2]; c < locb || hicb < c {
|
|
||||||
size = 1
|
|
||||||
} else if size == 3 {
|
|
||||||
} else if c := p[i+3]; c < locb || hicb < c {
|
|
||||||
size = 1
|
|
||||||
}
|
|
||||||
i += size
|
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user