Closed Codebreaker101 closed 4 years ago
I ran @Codebreaker101 's code on my local, it shows the same result. I dived into the details and found that the most time consuming part is the email validation part. If we remove the email validation part from both sides, we could find that ozzo validator is only a little bit slower. The below is my result.
1.216925ms
1.42975ms
2.081075ms
7.263525ms
ozzo validator depends on gopkg.in/asaskevich/govalidator.v9 Here is the source code how it validates emails
func IsEmail(email string) bool {
if len(email) < 6 || len(email) > 254 {
return false
}
at := strings.LastIndex(email, "@")
if at <= 0 || at > len(email)-3 {
return false
}
user := email[:at]
host := email[at+1:]
if len(user) > 64 {
return false
}
if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) {
return false
}
switch host {
case "localhost", "example.com":
return true
}
if _, err := net.LookupMX(host); err != nil {
if _, err := net.LookupIP(host); err != nil {
return false
}
}
return true
}
You could notice that its logic is really time-consuming, it splits the email string into two pieces and then use regex match three times, and then it tries to use net package to check whether the host is reachable. I think ozzo validator may need to use other validators or implement itself's.
I think https://github.com/go-ozzo/ozzo-validation/issues/98 talks about the similiar thing.
Thank you for the investigation! Added is.EmailFormat
which does string matching without checking MX. See https://github.com/go-ozzo/ozzo-validation/commit/f0cccd2ddbe5e809bdc6b8bfeb40d10ed25be3fb
Here is a simple test that check performance:
And the results are:
ozzo validator is around 100x slower than pure go-validator. Any information about that?