gitee.com/xuesongtao/protoc-go-valid@v1.6.16/valid/benchmark_test.go (about)

     1  package valid
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"strings"
     7  	"testing"
     8  )
     9  
    10  type TestOrder struct {
    11  	AppName string `alipay:"to=5~10" validate:"min=5,max=10"` // 应用名
    12  	// TotalFeeFloat        float64                 `alipay:"to=2~5" validate:"min:2|max:5"` // 订单总金额,单位为分,详见支付金额
    13  	TotalFeeFloat        float64                 `alipay:"to=2~5" validate:"min=2,max=5"` // 订单总金额,单位为分,详见支付金额
    14  	TestOrderDetailPtr   *TestOrderDetailPtr     `alipay:"required" validate:"required"`  // 商品详细描述
    15  	TestOrderDetailSlice []*TestOrderDetailSlice `alipay:"required" validate:"required"`  // 商品详细描述
    16  }
    17  
    18  type TestOrderDetailPtr struct {
    19  	TmpTest3  *TmpTest3 `alipay:"required" validate:"required"`
    20  	GoodsName string    `alipay:"to=1~2" validate:"min=1,max=2"`
    21  }
    22  
    23  type TestOrderDetailSlice struct {
    24  	TmpTest3   *TmpTest3 `alipay:"required" validate:"required"`
    25  	GoodsName  string    `alipay:"required" validate:"required"`
    26  	BuyerNames []string  `alipay:"required" validate:"required"`
    27  }
    28  
    29  type TmpTest3 struct {
    30  	Name string `alipay:"required" valid:"required" validate:"required"`
    31  }
    32  
    33  func BenchmarkStringSplitValid(b *testing.B) {
    34  	var s []string
    35  	for i := 0; i < b.N; i++ {
    36  		s = ValidNamesSplit("required,phone,test")
    37  	}
    38  	_ = s
    39  }
    40  func BenchmarkStringSplitValid1(b *testing.B) {
    41  	var s []string
    42  	for i := 0; i < b.N; i++ {
    43  		s = ValidNamesSplit("required,phone,test|'test'")
    44  	}
    45  	_ = s
    46  }
    47  
    48  func BenchmarkStringSplit(b *testing.B) {
    49  	var s []string
    50  	for i := 0; i < b.N; i++ {
    51  		s = strings.Split("required,phone,test", ",")
    52  	}
    53  	_ = s
    54  }
    55  
    56  func BenchmarkReNoComplice(b *testing.B) {
    57  	a := "123456"
    58  	for i := 0; i < b.N; i++ {
    59  		_, _ = regexp.MatchString(`\d+`, a)
    60  	}
    61  }
    62  
    63  func BenchmarkReComplice(b *testing.B) {
    64  	a := "123456"
    65  	for i := 0; i < b.N; i++ {
    66  		_ = IntRe.MatchString(a)
    67  	}
    68  }
    69  
    70  func BenchmarkStrJoin1(b *testing.B) {
    71  	s := ""
    72  	for i := 0; i < 100; i++ {
    73  		s += fmt.Sprint(i) + ","
    74  	}
    75  	_ = s
    76  }
    77  func BenchmarkStrJoin2(b *testing.B) {
    78  	buf := newStrBuf()
    79  	for i := 0; i < 100; i++ {
    80  		buf.WriteString(fmt.Sprint(i) + ",")
    81  	}
    82  	_ = buf.String()
    83  }
    84  
    85  // go test -benchmem -run=^$ -bench ^BenchmarkValidateForValid gitee.com/xuesongtao/protoc-go-valid/valid -v -count=5
    86  
    87  func BenchmarkValidateForValid(b *testing.B) {
    88  	b.ResetTimer()
    89  	type Users struct {
    90  		Phone  string `valid:"required"`
    91  		Passwd string `valid:"required,to=6~20"`
    92  		Code   string `validate:"required,eq=6"`
    93  	}
    94  
    95  	users := &Users{
    96  		Phone:  "1326654487",
    97  		Passwd: "123",
    98  		Code:   "123456",
    99  	}
   100  
   101  	for i := 0; i < b.N; i++ {
   102  		_ = Struct(users)
   103  	}
   104  
   105  	// BenchmarkValidateForValid-8              1614230               744.7 ns/op           416 B/op          9 allocs/op
   106  	// BenchmarkValidateForValid-8              1617544               739.9 ns/op           416 B/op          9 allocs/op
   107  	// BenchmarkValidateForValid-8              1618682               740.3 ns/op           416 B/op          9 allocs/op
   108  	// BenchmarkValidateForValid-8              1621915               739.2 ns/op           416 B/op          9 allocs/op
   109  	// BenchmarkValidateForValid-8              1612825               739.7 ns/op           416 B/op          9 allocs/op
   110  }
   111  
   112  // go test -benchmem -run=^$ -bench ^BenchmarkComplexValid gitee.com/xuesongtao/protoc-go-valid/valid -v -count=5
   113  
   114  func BenchmarkComplexValid(b *testing.B) {
   115  	b.ResetTimer()
   116  	testOrderDetailPtr := &TestOrderDetailPtr{
   117  		TmpTest3:  &TmpTest3{Name: "测试"},
   118  		GoodsName: "玻尿酸",
   119  	}
   120  	// testOrderDetailPtr = nil
   121  
   122  	testOrderDetails := []*TestOrderDetailSlice{
   123  		{TmpTest3: &TmpTest3{Name: "测试1"}, BuyerNames: []string{"test1", "hello2"}},
   124  		{TmpTest3: &TmpTest3{Name: "测试2"}, GoodsName: "隆鼻"},
   125  		{GoodsName: "丰胸"},
   126  		{TmpTest3: &TmpTest3{Name: "测试4"}, GoodsName: "隆鼻"},
   127  	}
   128  	// testOrderDetails = nil
   129  
   130  	u := &TestOrder{
   131  		AppName:              "集美测试",
   132  		TotalFeeFloat:        2,
   133  		TestOrderDetailPtr:   testOrderDetailPtr,
   134  		TestOrderDetailSlice: testOrderDetails,
   135  	}
   136  	for i := 0; i < b.N; i++ {
   137  		_ = StructForFn(&u, nil, "alipay")
   138  	}
   139  
   140  	// BenchmarkComplexValid-8           209080              5954 ns/op            3977 B/op         66 allocs/op
   141  	// BenchmarkComplexValid-8           205692              5717 ns/op            3977 B/op         66 allocs/op
   142  	// BenchmarkComplexValid-8           205198              5700 ns/op            3977 B/op         66 allocs/op
   143  	// BenchmarkComplexValid-8           206556              5813 ns/op            3977 B/op         66 allocs/op
   144  	// BenchmarkComplexValid-8           205345              5756 ns/op            3977 B/op         66 allocs/op
   145  }
   146  
   147  func BenchmarkComplexValidIf(b *testing.B) {
   148  	b.ResetTimer()
   149  	testOrderDetailPtr := &TestOrderDetailPtr{
   150  		TmpTest3:  &TmpTest3{Name: "测试"},
   151  		GoodsName: "玻尿酸",
   152  	}
   153  	// testOrderDetailPtr = nil
   154  
   155  	testOrderDetails := []*TestOrderDetailSlice{
   156  		{TmpTest3: &TmpTest3{Name: "测试1"}, BuyerNames: []string{"test1", "hello2"}},
   157  		{TmpTest3: &TmpTest3{Name: "测试2"}, GoodsName: "隆鼻"},
   158  		{GoodsName: "丰胸"},
   159  		{TmpTest3: &TmpTest3{Name: "测试4"}, GoodsName: "隆鼻"},
   160  	}
   161  	// testOrderDetails = nil
   162  
   163  	u := &TestOrder{
   164  		AppName:              "集美测试",
   165  		TotalFeeFloat:        2,
   166  		TestOrderDetailPtr:   testOrderDetailPtr,
   167  		TestOrderDetailSlice: testOrderDetails,
   168  	}
   169  
   170  	vFn := func(info *TestOrder) {
   171  		// 说明: 写入的内容为随意写
   172  		errBuf := new(strings.Builder)
   173  		if len(info.AppName) >= 2 {
   174  			errBuf.WriteString("info.AppName len is short \n")
   175  		}
   176  
   177  		if len(info.AppName) <= 10 {
   178  			errBuf.WriteString("info.AppName len is long \n")
   179  		}
   180  
   181  		if info.TotalFeeFloat >= 2 {
   182  			errBuf.WriteString("info.TotalFeeFloat should more than 2 \n")
   183  		}
   184  
   185  		if info.TotalFeeFloat <= 5 {
   186  			errBuf.WriteString("info.TotalFeeFloat should more than 2 \n")
   187  		}
   188  
   189  		if info.TestOrderDetailPtr.TmpTest3 == nil {
   190  			errBuf.WriteString("info.TestOrderDetailPtr.TmpTest3 is nil \n")
   191  		} else {
   192  			if info.TestOrderDetailPtr.TmpTest3.Name == "" {
   193  				errBuf.WriteString("info.TestOrderDetailPtr.TmpTest3.Name is null \n")
   194  			}
   195  		}
   196  
   197  		if len(info.TestOrderDetailPtr.GoodsName) >= 2 {
   198  			errBuf.WriteString("info.TestOrderDetailPtr.GoodsName is null \n")
   199  		}
   200  
   201  		if len(info.TestOrderDetailPtr.GoodsName) <= 5 {
   202  			errBuf.WriteString("info.TestOrderDetailPtr.GoodsName is null \n")
   203  		}
   204  
   205  		if info.TestOrderDetailSlice == nil {
   206  			errBuf.WriteString("info.TestOrderDetailSlice is null \n")
   207  		} else {
   208  			for _, v := range info.TestOrderDetailSlice {
   209  				if v.TmpTest3 == nil {
   210  					errBuf.WriteString("info.TestOrderDetailPtr.GoodsName is null \n")
   211  				} else {
   212  					if v.TmpTest3.Name == "" {
   213  						errBuf.WriteString("info.TestOrderDetailPtr.GoodsName is null \n")
   214  					}
   215  				}
   216  
   217  				if len(v.BuyerNames) == 0 {
   218  					errBuf.WriteString("info.TestOrderDetailPtr.GoodsName is null \n")
   219  				}
   220  
   221  				if v.GoodsName == "" {
   222  					errBuf.WriteString("info.TestOrderDetailPtr.GoodsName is null \n")
   223  				}
   224  			}
   225  		}
   226  	}
   227  	for i := 0; i < b.N; i++ {
   228  		vFn(u)
   229  	}
   230  
   231  	// BenchmarkValidIf-8       4908489               242.1 ns/op          1232 B/op          5 allocs/op
   232  	// BenchmarkValidIf-8       4932530               240.9 ns/op          1232 B/op          5 allocs/op
   233  	// BenchmarkValidIf-8       4938175               252.1 ns/op          1232 B/op          5 allocs/op
   234  	// BenchmarkValidIf-8       4774190               251.2 ns/op          1232 B/op          5 allocs/op
   235  	// BenchmarkValidIf-8       4901599               253.2 ns/op          1232 B/op          5 allocs/op
   236  }