Merge pull request #120 from joeybloggs/v6-development

Update Docs. and Benchmarks
pull/121/head
Dean Karn 9 years ago
commit 781f596065
  1. 18
      README.md
  2. 116
      benchmarks_test.go
  3. 5
      doc.go

@ -120,12 +120,18 @@ hurt parallel performance too much.
```go ```go
$ go test -cpu=4 -bench=. -benchmem=true $ go test -cpu=4 -bench=. -benchmem=true
PASS PASS
BenchmarkField-4 5000000 314 ns/op 16 B/op 1 allocs/op BenchmarkFieldSuccess-4 5000000 326 ns/op 16 B/op 1 allocs/op
BenchmarkFieldOrTag-4 500000 2425 ns/op 20 B/op 2 allocs/op BenchmarkFieldFailure-4 5000000 327 ns/op 16 B/op 1 allocs/op
BenchmarkStructSimple-4 500000 3117 ns/op 553 B/op 14 allocs/op BenchmarkFieldOrTagSuccess-4 500000 2738 ns/op 20 B/op 2 allocs/op
BenchmarkStructSimpleParallel-4 1000000 1149 ns/op 553 B/op 14 allocs/op BenchmarkFieldOrTagFailure-4 1000000 1341 ns/op 384 B/op 6 allocs/op
BenchmarkStructComplex-4 100000 19580 ns/op 3230 B/op 102 allocs/op BenchmarkStructSimpleSuccess-4 1000000 1282 ns/op 24 B/op 3 allocs/op
BenchmarkStructComplexParallel-4 200000 6686 ns/op 3232 B/op 102 allocs/op BenchmarkStructSimpleFailure-4 1000000 1870 ns/op 529 B/op 11 allocs/op
BenchmarkStructSimpleSuccessParallel-4 5000000 348 ns/op 24 B/op 3 allocs/op
BenchmarkStructSimpleFailureParallel-4 2000000 807 ns/op 529 B/op 11 allocs/op
BenchmarkStructComplexSuccess-4 200000 8081 ns/op 368 B/op 30 allocs/op
BenchmarkStructComplexFailure-4 100000 12418 ns/op 2861 B/op 72 allocs/op
BenchmarkStructComplexSuccessParallel-4 500000 2249 ns/op 369 B/op 30 allocs/op
BenchmarkStructComplexFailureParallel-4 300000 5183 ns/op 2863 B/op 72 allocs/op
``` ```
How to Contribute How to Contribute

@ -2,19 +2,31 @@ package validator
import "testing" import "testing"
func BenchmarkField(b *testing.B) { func BenchmarkFieldSuccess(b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
validate.Field("1", "len=1") validate.Field("1", "len=1")
} }
} }
func BenchmarkFieldOrTag(b *testing.B) { func BenchmarkFieldFailure(b *testing.B) {
for n := 0; n < b.N; n++ {
validate.Field("2", "len=1")
}
}
func BenchmarkFieldOrTagSuccess(b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
validate.Field("rgba(0,0,0,1)", "rgb|rgba") validate.Field("rgba(0,0,0,1)", "rgb|rgba")
} }
} }
func BenchmarkStructSimple(b *testing.B) { func BenchmarkFieldOrTagFailure(b *testing.B) {
for n := 0; n < b.N; n++ {
validate.Field("#000", "rgb|rgba")
}
}
func BenchmarkStructSimpleSuccess(b *testing.B) {
type Foo struct { type Foo struct {
StringValue string `validate:"min=5,max=10"` StringValue string `validate:"min=5,max=10"`
@ -22,15 +34,27 @@ func BenchmarkStructSimple(b *testing.B) {
} }
validFoo := &Foo{StringValue: "Foobar", IntValue: 7} validFoo := &Foo{StringValue: "Foobar", IntValue: 7}
invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
validate.Struct(validFoo) validate.Struct(validFoo)
}
}
func BenchmarkStructSimpleFailure(b *testing.B) {
type Foo struct {
StringValue string `validate:"min=5,max=10"`
IntValue int `validate:"min=5,max=10"`
}
invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
for n := 0; n < b.N; n++ {
validate.Struct(invalidFoo) validate.Struct(invalidFoo)
} }
} }
func BenchmarkStructSimpleParallel(b *testing.B) { func BenchmarkStructSimpleSuccessParallel(b *testing.B) {
type Foo struct { type Foo struct {
StringValue string `validate:"min=5,max=10"` StringValue string `validate:"min=5,max=10"`
@ -38,42 +62,32 @@ func BenchmarkStructSimpleParallel(b *testing.B) {
} }
validFoo := &Foo{StringValue: "Foobar", IntValue: 7} validFoo := &Foo{StringValue: "Foobar", IntValue: 7}
invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {
validate.Struct(validFoo) validate.Struct(validFoo)
validate.Struct(invalidFoo)
} }
}) })
} }
func BenchmarkStructComplex(b *testing.B) { func BenchmarkStructSimpleFailureParallel(b *testing.B) {
tFail := &TestString{ type Foo struct {
Required: "", StringValue string `validate:"min=5,max=10"`
Len: "", IntValue int `validate:"min=5,max=10"`
Min: "",
Max: "12345678901",
MinMax: "",
Lt: "0123456789",
Lte: "01234567890",
Gt: "1",
Gte: "1",
OmitEmpty: "12345678901",
Sub: &SubTest{
Test: "",
},
Anonymous: struct {
A string `validate:"required"`
}{
A: "",
},
Iface: &Impl{
F: "12",
},
} }
invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
validate.Struct(invalidFoo)
}
})
}
func BenchmarkStructComplexSuccess(b *testing.B) {
tSuccess := &TestString{ tSuccess := &TestString{
Required: "Required", Required: "Required",
Len: "length==10", Len: "length==10",
@ -103,11 +117,10 @@ func BenchmarkStructComplex(b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
validate.Struct(tSuccess) validate.Struct(tSuccess)
validate.Struct(tFail)
} }
} }
func BenchmarkStructComplexParallel(b *testing.B) { func BenchmarkStructComplexFailure(b *testing.B) {
tFail := &TestString{ tFail := &TestString{
Required: "", Required: "",
@ -133,6 +146,13 @@ func BenchmarkStructComplexParallel(b *testing.B) {
}, },
} }
for n := 0; n < b.N; n++ {
validate.Struct(tFail)
}
}
func BenchmarkStructComplexSuccessParallel(b *testing.B) {
tSuccess := &TestString{ tSuccess := &TestString{
Required: "Required", Required: "Required",
Len: "length==10", Len: "length==10",
@ -163,6 +183,38 @@ func BenchmarkStructComplexParallel(b *testing.B) {
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {
validate.Struct(tSuccess) validate.Struct(tSuccess)
}
})
}
func BenchmarkStructComplexFailureParallel(b *testing.B) {
tFail := &TestString{
Required: "",
Len: "",
Min: "",
Max: "12345678901",
MinMax: "",
Lt: "0123456789",
Lte: "01234567890",
Gt: "1",
Gte: "1",
OmitEmpty: "12345678901",
Sub: &SubTest{
Test: "",
},
Anonymous: struct {
A string `validate:"required"`
}{
A: "",
},
Iface: &Impl{
F: "12",
},
}
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
validate.Struct(tFail) validate.Struct(tFail)
} }
}) })

@ -121,11 +121,6 @@ Here is a list of the current built in validators:
gt=0 will be applied to [] gt=0 will be applied to []
[]string will be spared validation []string will be spared validation
required will be applied to string required will be applied to string
NOTE: in Example2 if the required validation failed, but all others passed
the hierarchy of FieldError's in the middle with have their IsPlaceHolder field
set to true. If a FieldError has IsSliceOrMap=true or IsMap=true then the
FieldError is a Slice or Map field and if IsPlaceHolder=true then contains errors
within its SliceOrArrayErrs or MapErrs fields.
required required
This validates that the value is not the data types default value. This validates that the value is not the data types default value.

Loading…
Cancel
Save