| Index: src/pkg/strings/strings_test.go |
| =================================================================== |
| --- a/src/pkg/strings/strings_test.go |
| +++ b/src/pkg/strings/strings_test.go |
| @@ -7,6 +7,7 @@ |
| import ( |
| "bytes" |
| "io" |
| + "math/rand" |
| "reflect" |
| . "strings" |
| "testing" |
| @@ -311,6 +312,13 @@ |
| } |
| 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' } |
| for _, tt := range FieldsFuncTests { |
| a := FieldsFunc(tt.s, pred) |
| @@ -984,3 +992,39 @@ |
| } |
| } |
| } |
| + |
| +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) |
| + } |
| +} |