Skip to content

Commit a47156f

Browse files
committed
First commit
0 parents  commit a47156f

File tree

5 files changed

+305
-0
lines changed

5 files changed

+305
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.idea
2+
.vscode

go.mod

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module benchGolangValidators
2+
3+
go 1.15
4+
5+
require (
6+
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef
7+
github.com/davecgh/go-spew v1.1.1 // indirect
8+
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
9+
github.com/go-playground/validator/v10 v10.4.1
10+
github.com/gobuffalo/validate v2.0.4+incompatible
11+
github.com/gofrs/uuid v3.3.0+incompatible // indirect
12+
github.com/onsi/ginkgo v1.14.2 // indirect
13+
github.com/onsi/gomega v1.10.3 // indirect
14+
github.com/serenize/snaker v0.0.0-20201027110005-a7ad2135616e // indirect
15+
github.com/stretchr/testify v1.6.1 // indirect
16+
github.com/thedevsaddam/govalidator v1.9.10
17+
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 // indirect
18+
golang.org/x/sys v0.0.0-20201126233918-771906719818 // indirect
19+
)

go.sum

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
2+
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg=
3+
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
4+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
7+
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
8+
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es=
9+
github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew=
10+
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
11+
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
12+
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
13+
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
14+
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
15+
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
16+
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
17+
github.com/gobuffalo/validate v2.0.4+incompatible h1:ZTxozrIw8qQ5nfhShmc4izjYPTsPhfdXTdhXOd5OS9o=
18+
github.com/gobuffalo/validate v2.0.4+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM=
19+
github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84=
20+
github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
21+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
22+
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
23+
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
24+
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
25+
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
26+
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
27+
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
28+
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
29+
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
30+
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
31+
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
32+
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
33+
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
34+
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
35+
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
36+
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
37+
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
38+
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
39+
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
40+
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
41+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
42+
github.com/serenize/snaker v0.0.0-20201027110005-a7ad2135616e h1:zWKUYT07mGmVBH+9UgnHXd/ekCK99C8EbDSAt5qsjXE=
43+
github.com/serenize/snaker v0.0.0-20201027110005-a7ad2135616e/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
44+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
45+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
46+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
47+
github.com/thedevsaddam/govalidator v1.9.10 h1:m3dLRbSZ5Hts3VUWYe+vxLMG+FdyQuWOjzTeQRiMCvU=
48+
github.com/thedevsaddam/govalidator v1.9.10/go.mod h1:Ilx8u7cg5g3LXbSS943cx5kczyNuUn7LH/cK5MYuE90=
49+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
50+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
51+
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc=
52+
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
53+
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
54+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
55+
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
56+
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
57+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
58+
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
59+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
60+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
61+
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62+
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63+
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
64+
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65+
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
66+
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
67+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
68+
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
69+
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
70+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
71+
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
72+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
73+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
74+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75+
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
76+
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
77+
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
78+
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
79+
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
80+
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
81+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
82+
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
83+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
84+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
85+
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
86+
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
87+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

main.go

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"github.com/asaskevich/govalidator"
6+
"github.com/go-ozzo/ozzo-validation/v4"
7+
"github.com/go-ozzo/ozzo-validation/v4/is"
8+
"github.com/go-playground/validator/v10"
9+
buffalo "github.com/gobuffalo/validate"
10+
"github.com/gobuffalo/validate/validators"
11+
saddam "github.com/thedevsaddam/govalidator"
12+
)
13+
14+
type User struct {
15+
FirstName string `json:"firstname" valid:"required" validate:"required"`
16+
LastName string `json:"lastname" valid:"required" validate:"required"`
17+
Age int `json:"age" valid:"range(0|130)" validate:"gte=0,lte=130"`
18+
Email string `json:"email" valid:"required,email" validate:"required,email"`
19+
Street string `json:"street" valid:"required" validate:"required"`
20+
City string `json:"city" valid:"required" validate:"required"`
21+
Planet string `json:"planet" valid:"required" validate:"required"`
22+
Phone string `json:"phone" valid:"required" validate:"required"`
23+
}
24+
25+
func main() {
26+
user := newUser()
27+
playgroundValidate := validator.New()
28+
29+
validateWithAsaskevich(user)
30+
validateWithPlayground(playgroundValidate, user)
31+
validateWithSaddam(user)
32+
validateWithBuffalo(user)
33+
validateWithOzzo(user)
34+
}
35+
36+
func newUser() *User {
37+
return &User{
38+
FirstName: "Badger",
39+
LastName: "Smith",
40+
Age: 80,
41+
City: "string",
42+
43+
Street: "Eavesdown Docks",
44+
Planet: "Persphone",
45+
Phone: "none",
46+
}
47+
}
48+
49+
func validateWithAsaskevich(user *User) {
50+
if _, err := govalidator.ValidateStruct(user); err != nil {
51+
println("Asaskevich: " + err.Error())
52+
}
53+
}
54+
55+
func validateWithPlayground(validate *validator.Validate, user *User) {
56+
if err := validate.Struct(user); err != nil {
57+
println("Playground: " + err.Error())
58+
}
59+
}
60+
61+
func validateWithSaddam(user *User) {
62+
rules := saddam.MapData{
63+
"firstname": []string{"required"},
64+
"lastname": []string{"required"},
65+
"age": []string{"min:0", "max:130"},
66+
"email": []string{"required", "email"},
67+
"street": []string{"required"},
68+
"city": []string{"required"},
69+
"planet": []string{"required"},
70+
"phone": []string{"required"},
71+
}
72+
opts := saddam.Options{
73+
Data: user,
74+
Rules: rules,
75+
}
76+
v := saddam.New(opts)
77+
e := v.ValidateStruct()
78+
if len(e) > 0 {
79+
data, _ := json.Marshal(e)
80+
println("Saddam: " + string(data))
81+
}
82+
}
83+
84+
func validateWithBuffalo(user *User) {
85+
errors := buffalo.Validate(
86+
&validators.StringIsPresent{Field: user.FirstName},
87+
&validators.StringIsPresent{Field: user.LastName},
88+
&validators.IntIsGreaterThan{Field: user.Age, Compared: 0},
89+
&validators.IntIsLessThan{Field: user.Age, Compared: 130},
90+
&validators.EmailIsPresent{Field: user.Email},
91+
&validators.StringIsPresent{Field: user.Street},
92+
&validators.StringIsPresent{Field: user.City},
93+
&validators.StringIsPresent{Field: user.Planet},
94+
&validators.StringIsPresent{Field: user.Phone},
95+
)
96+
if len(errors.Errors) > 0 {
97+
println(errors.Error())
98+
}
99+
}
100+
101+
func validateWithOzzo(user *User) {
102+
err := validation.ValidateStruct(user,
103+
validation.Field(&user.FirstName, validation.Required),
104+
validation.Field(&user.LastName, validation.Required),
105+
validation.Field(&user.Age, validation.Min(0), validation.Max(130)),
106+
validation.Field(&user.Email, validation.Required, is.Email),
107+
validation.Field(&user.Street, validation.Required),
108+
validation.Field(&user.City, validation.Required),
109+
validation.Field(&user.Planet, validation.Required),
110+
validation.Field(&user.Phone, validation.Required),
111+
)
112+
if err != nil {
113+
println("Ozzo: " + err.Error())
114+
}
115+
}

main_test.go

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package main
2+
3+
import (
4+
"github.com/go-playground/validator/v10"
5+
saddam "github.com/thedevsaddam/govalidator"
6+
"testing"
7+
)
8+
9+
func BenchmarkAsaskevich(b *testing.B) {
10+
user := newUser()
11+
12+
b.ReportAllocs()
13+
b.ResetTimer()
14+
15+
for n := 0; n < b.N; n++ {
16+
validateWithAsaskevich(user)
17+
}
18+
}
19+
20+
func BenchmarkPlayground(b *testing.B) {
21+
user := newUser()
22+
validate := validator.New()
23+
24+
b.ReportAllocs()
25+
b.ResetTimer()
26+
27+
for n := 0; n < b.N; n++ {
28+
validateWithPlayground(validate, user)
29+
}
30+
}
31+
32+
func BenchmarkSaddam(b *testing.B) {
33+
user := newUser()
34+
35+
rules := saddam.MapData{
36+
"firstname": []string{"required"},
37+
"lastname": []string{"required"},
38+
"age": []string{"min:0", "max:130"},
39+
"email": []string{"required", "email"},
40+
"street": []string{"required"},
41+
"city": []string{"required"},
42+
"planet": []string{"required"},
43+
"phone": []string{"required"},
44+
}
45+
opts := saddam.Options{
46+
Data: user,
47+
Rules: rules,
48+
}
49+
v := saddam.New(opts)
50+
51+
b.ReportAllocs()
52+
b.ResetTimer()
53+
54+
for n := 0; n < b.N; n++ {
55+
e := v.ValidateStruct()
56+
if len(e) > 0 {
57+
println(e)
58+
}
59+
}
60+
}
61+
62+
func BenchmarkBuffalo(b *testing.B) {
63+
user := newUser()
64+
65+
b.ReportAllocs()
66+
b.ResetTimer()
67+
68+
for n := 0; n < b.N; n++ {
69+
validateWithBuffalo(user)
70+
}
71+
}
72+
73+
func BenchmarkOzzo(b *testing.B) {
74+
user := newUser()
75+
76+
b.ReportAllocs()
77+
b.ResetTimer()
78+
79+
for n := 0; n < b.N; n++ {
80+
validateWithOzzo(user)
81+
}
82+
}

0 commit comments

Comments
 (0)