From 4e43fa1562a37d28e2e22e5c26b7a64862968203 Mon Sep 17 00:00:00 2001 From: Dean Karn Date: Tue, 15 Nov 2016 20:36:34 -0500 Subject: [PATCH] change field cache to array - errors now come out in order for unit tests - speed improvement using array vs map benchmark old ns/op new ns/op delta BenchmarkFieldSuccess-8 101 100 -0.99% BenchmarkFieldSuccessParallel-8 33.2 33.7 +1.51% BenchmarkFieldFailure-8 323 332 +2.79% BenchmarkFieldFailureParallel-8 112 113 +0.89% BenchmarkFieldDiveSuccess-8 719 714 -0.70% BenchmarkFieldDiveSuccessParallel-8 230 225 -2.17% BenchmarkFieldDiveFailure-8 1001 987 -1.40% BenchmarkFieldDiveFailureParallel-8 323 317 -1.86% BenchmarkFieldCustomTypeSuccess-8 263 264 +0.38% BenchmarkFieldCustomTypeSuccessParallel-8 82.6 81.4 -1.45% BenchmarkFieldCustomTypeFailure-8 327 328 +0.31% BenchmarkFieldCustomTypeFailureParallel-8 116 116 +0.00% BenchmarkFieldOrTagSuccess-8 871 878 +0.80% BenchmarkFieldOrTagSuccessParallel-8 394 402 +2.03% BenchmarkFieldOrTagFailure-8 568 569 +0.18% BenchmarkFieldOrTagFailureParallel-8 397 401 +1.01% BenchmarkStructLevelValidationSuccess-8 332 267 -19.58% BenchmarkStructLevelValidationSuccessParallel-8 105 82.4 -21.52% BenchmarkStructLevelValidationFailure-8 637 557 -12.56% BenchmarkStructLevelValidationFailureParallel-8 260 226 -13.08% BenchmarkStructSimpleCustomTypeSuccess-8 525 452 -13.90% BenchmarkStructSimpleCustomTypeSuccessParallel-8 155 144 -7.10% BenchmarkStructSimpleCustomTypeFailure-8 828 738 -10.87% BenchmarkStructSimpleCustomTypeFailureParallel-8 345 285 -17.39% BenchmarkStructFilteredSuccess-8 744 664 -10.75% BenchmarkStructFilteredSuccessParallel-8 274 257 -6.20% BenchmarkStructFilteredFailure-8 595 517 -13.11% BenchmarkStructFilteredFailureParallel-8 250 195 -22.00% BenchmarkStructPartialSuccess-8 674 608 -9.79% BenchmarkStructPartialSuccessParallel-8 256 225 -12.11% BenchmarkStructPartialFailure-8 928 848 -8.62% BenchmarkStructPartialFailureParallel-8 399 360 -9.77% BenchmarkStructExceptSuccess-8 1076 934 -13.20% BenchmarkStructExceptSuccessParallel-8 237 200 -15.61% BenchmarkStructExceptFailure-8 873 787 -9.85% BenchmarkStructExceptFailureParallel-8 365 333 -8.77% BenchmarkStructSimpleCrossFieldSuccess-8 539 489 -9.28% BenchmarkStructSimpleCrossFieldSuccessParallel-8 201 168 -16.42% BenchmarkStructSimpleCrossFieldFailure-8 788 709 -10.03% BenchmarkStructSimpleCrossFieldFailureParallel-8 322 299 -7.14% BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 795 683 -14.09% BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 241 211 -12.45% BenchmarkStructSimpleCrossStructCrossFieldFailure-8 1110 940 -15.32% BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 399 333 -16.54% BenchmarkStructSimpleSuccess-8 367 285 -22.34% BenchmarkStructSimpleSuccessParallel-8 108 91.0 -15.74% BenchmarkStructSimpleFailure-8 776 698 -10.05% BenchmarkStructSimpleFailureParallel-8 307 284 -7.49% BenchmarkStructComplexSuccess-8 2224 1622 -27.07% BenchmarkStructComplexSuccessParallel-8 718 526 -26.74% BenchmarkStructComplexFailure-8 5350 4717 -11.83% BenchmarkStructComplexFailureParallel-8 2097 1853 -11.64% --- README.md | 2 +- cache.go | 8 ++++---- validator.go | 6 +++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a52ceaf..7a7d84e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Package validator ================ [![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -![Project status](https://img.shields.io/badge/version-9.2.1-green.svg) +![Project status](https://img.shields.io/badge/version-9.2.2-green.svg) [![Build Status](https://semaphoreci.com/api/v1/joeybloggs/validator/branches/v9/badge.svg)](https://semaphoreci.com/joeybloggs/validator) [![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=v9&service=github)](https://coveralls.io/github/go-playground/validator?branch=v9) [![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator) diff --git a/cache.go b/cache.go index aabe17f..d596bd5 100644 --- a/cache.go +++ b/cache.go @@ -70,7 +70,7 @@ func (tc *tagCache) Set(key string, value *cTag) { type cStruct struct { name string - fields map[int]*cField + fields []*cField fn StructLevelFunc } @@ -108,7 +108,7 @@ func (v *Validate) extractStructCache(current reflect.Value, sName string) *cStr return cs } - cs = &cStruct{name: sName, fields: make(map[int]*cField), fn: v.structLevelFuncs[typ]} + cs = &cStruct{name: sName, fields: make([]*cField, 0), fn: v.structLevelFuncs[typ]} numFields := current.NumField() @@ -153,13 +153,13 @@ func (v *Validate) extractStructCache(current reflect.Value, sName string) *cStr ctag = new(cTag) } - cs.fields[i] = &cField{ + cs.fields = append(cs.fields, &cField{ idx: i, name: fld.Name, altName: customName, cTags: ctag, namesEqual: fld.Name == customName, - } + }) } v.structCache.Set(typ, cs) diff --git a/validator.go b/validator.go index 94d9e8d..4324e39 100644 --- a/validator.go +++ b/validator.go @@ -53,7 +53,11 @@ func (v *validate) validateStruct(parent reflect.Value, current reflect.Value, t // so if nil or if not nil and the structonly tag isn't present if ct == nil || ct.typeof != typeStructOnly { - for _, f := range cs.fields { + var f *cField + + for i := 0; i < len(cs.fields); i++ { + + f = cs.fields[i] if v.isPartial {