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 }