mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
bytes, strings: optimize Split*
The relevant benchmark results on linux/amd64: bytes: SplitSingleByteSeparator-4 25.7ms ± 5% 9.1ms ± 4% -64.40% (p=0.000 n=10+10) SplitMultiByteSeparator-4 13.8ms ±20% 4.3ms ± 8% -69.23% (p=0.000 n=10+10) SplitNSingleByteSeparator-4 1.88µs ± 9% 0.88µs ± 4% -53.25% (p=0.000 n=10+10) SplitNMultiByteSeparator-4 4.83µs ±10% 1.32µs ± 9% -72.65% (p=0.000 n=10+10) strings: name old time/op new time/op delta SplitSingleByteSeparator-4 21.4ms ± 8% 8.5ms ± 5% -60.19% (p=0.000 n=10+10) SplitMultiByteSeparator-4 13.2ms ± 9% 3.9ms ± 4% -70.29% (p=0.000 n=10+10) SplitNSingleByteSeparator-4 1.54µs ± 5% 0.75µs ± 7% -51.21% (p=0.000 n=10+10) SplitNMultiByteSeparator-4 3.57µs ± 8% 1.01µs ±11% -71.76% (p=0.000 n=10+10) Fixes #18973 Change-Id: Ie4bc010c6cc389001e72eab530497c81e5b26f34 Reviewed-on: https://go-review.googlesource.com/36510 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
c026845bd2
commit
8946502776
4 changed files with 92 additions and 25 deletions
|
|
@ -1432,6 +1432,59 @@ func BenchmarkTrimSpace(b *testing.B) {
|
|||
}
|
||||
}
|
||||
|
||||
func makeBenchInputHard() []byte {
|
||||
tokens := [...]string{
|
||||
"<a>", "<p>", "<b>", "<strong>",
|
||||
"</a>", "</p>", "</b>", "</strong>",
|
||||
"hello", "world",
|
||||
}
|
||||
x := make([]byte, 0, 1<<20)
|
||||
for {
|
||||
i := rand.Intn(len(tokens))
|
||||
if len(x)+len(tokens[i]) >= 1<<20 {
|
||||
break
|
||||
}
|
||||
x = append(x, tokens[i]...)
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
var benchInputHard = makeBenchInputHard()
|
||||
|
||||
func BenchmarkSplitEmptySeparator(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
Split(benchInputHard, nil)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkSplitSingleByteSeparator(b *testing.B) {
|
||||
sep := []byte("/")
|
||||
for i := 0; i < b.N; i++ {
|
||||
Split(benchInputHard, sep)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkSplitMultiByteSeparator(b *testing.B) {
|
||||
sep := []byte("hello")
|
||||
for i := 0; i < b.N; i++ {
|
||||
Split(benchInputHard, sep)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkSplitNSingleByteSeparator(b *testing.B) {
|
||||
sep := []byte("/")
|
||||
for i := 0; i < b.N; i++ {
|
||||
SplitN(benchInputHard, sep, 10)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkSplitNMultiByteSeparator(b *testing.B) {
|
||||
sep := []byte("hello")
|
||||
for i := 0; i < b.N; i++ {
|
||||
SplitN(benchInputHard, sep, 10)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkRepeat(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
Repeat([]byte("-"), 80)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue