mirror of
https://github.com/golang/go
synced 2024-11-22 00:04:41 -07:00
bytes, strings: add Fields benchmarks
The performance changes will be a few different CLs. Start with benchmarks as a baseline. R=golang-dev, r CC=golang-dev https://golang.org/cl/6537043
This commit is contained in:
parent
35724c1aa5
commit
0e60019a42
@ -6,6 +6,7 @@ package bytes_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
. "bytes"
|
. "bytes"
|
||||||
|
"math/rand"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
"unicode"
|
"unicode"
|
||||||
@ -567,6 +568,14 @@ func TestFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFieldsFunc(t *testing.T) {
|
func TestFieldsFunc(t *testing.T) {
|
||||||
|
for _, tt := range fieldstests {
|
||||||
|
a := FieldsFunc([]byte(tt.s), unicode.IsSpace)
|
||||||
|
result := arrayOfString(a)
|
||||||
|
if !eq(result, tt.a) {
|
||||||
|
t.Errorf("FieldsFunc(%q, unicode.IsSpace) = %v; want %v", tt.s, a, tt.a)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
pred := func(c rune) bool { return c == 'X' }
|
pred := func(c rune) bool { return c == 'X' }
|
||||||
var fieldsFuncTests = []FieldsTest{
|
var fieldsFuncTests = []FieldsTest{
|
||||||
{"", []string{}},
|
{"", []string{}},
|
||||||
@ -1014,3 +1023,39 @@ func TestEqualFold(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var makeFieldsInput = func() []byte {
|
||||||
|
x := make([]byte, 1<<20)
|
||||||
|
// Input is ~10% space, ~10% 2-byte UTF-8, rest ASCII non-space.
|
||||||
|
for i := range x {
|
||||||
|
switch rand.Intn(10) {
|
||||||
|
case 0:
|
||||||
|
x[i] = ' '
|
||||||
|
case 1:
|
||||||
|
if i > 0 && x[i-1] == 'x' {
|
||||||
|
copy(x[i-1:], "χ")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fallthrough
|
||||||
|
default:
|
||||||
|
x[i] = 'x'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
var fieldsInput = makeFieldsInput()
|
||||||
|
|
||||||
|
func BenchmarkFields(b *testing.B) {
|
||||||
|
b.SetBytes(int64(len(fieldsInput)))
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
Fields(fieldsInput)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkFieldsFunc(b *testing.B) {
|
||||||
|
b.SetBytes(int64(len(fieldsInput)))
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
FieldsFunc(fieldsInput, unicode.IsSpace)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@ package strings_test
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
|
"math/rand"
|
||||||
"reflect"
|
"reflect"
|
||||||
. "strings"
|
. "strings"
|
||||||
"testing"
|
"testing"
|
||||||
@ -311,6 +312,13 @@ var FieldsFuncTests = []FieldsTest{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFieldsFunc(t *testing.T) {
|
func TestFieldsFunc(t *testing.T) {
|
||||||
|
for _, tt := range fieldstests {
|
||||||
|
a := FieldsFunc(tt.s, unicode.IsSpace)
|
||||||
|
if !eq(a, tt.a) {
|
||||||
|
t.Errorf("FieldsFunc(%q, unicode.IsSpace) = %v; want %v", tt.s, a, tt.a)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
pred := func(c rune) bool { return c == 'X' }
|
pred := func(c rune) bool { return c == 'X' }
|
||||||
for _, tt := range FieldsFuncTests {
|
for _, tt := range FieldsFuncTests {
|
||||||
a := FieldsFunc(tt.s, pred)
|
a := FieldsFunc(tt.s, pred)
|
||||||
@ -984,3 +992,39 @@ func TestEqualFold(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var makeFieldsInput = func() string {
|
||||||
|
x := make([]byte, 1<<20)
|
||||||
|
// Input is ~10% space, ~10% 2-byte UTF-8, rest ASCII non-space.
|
||||||
|
for i := range x {
|
||||||
|
switch rand.Intn(10) {
|
||||||
|
case 0:
|
||||||
|
x[i] = ' '
|
||||||
|
case 1:
|
||||||
|
if i > 0 && x[i-1] == 'x' {
|
||||||
|
copy(x[i-1:], "χ")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fallthrough
|
||||||
|
default:
|
||||||
|
x[i] = 'x'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fieldsInput = makeFieldsInput()
|
||||||
|
|
||||||
|
func BenchmarkFields(b *testing.B) {
|
||||||
|
b.SetBytes(int64(len(fieldsInput)))
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
Fields(fieldsInput)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkFieldsFunc(b *testing.B) {
|
||||||
|
b.SetBytes(int64(len(fieldsInput)))
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
FieldsFunc(fieldsInput, unicode.IsSpace)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user