1
0
mirror of https://github.com/golang/go synced 2024-11-21 17:44:40 -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:
Russ Cox 2012-09-18 15:02:08 -04:00
parent 35724c1aa5
commit 0e60019a42
2 changed files with 89 additions and 0 deletions

View File

@ -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)
}
}

View File

@ -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)
}
}