github.com/vkolev/form@v1.2.1/benchmarks/benchmarks_test.go (about) 1 package benchmarks 2 3 import ( 4 "net/url" 5 "testing" 6 7 "github.com/go-playground/form" 8 ) 9 10 // Simple Benchmarks 11 12 type User struct { 13 FirstName string `form:"fname" schema:"fname" formam:"fname"` 14 LastName string `form:"lname" schema:"lname" formam:"lname"` 15 Email string `form:"email" schema:"email" formam:"email"` 16 Age uint8 `form:"age" schema:"age" formam:"age"` 17 } 18 19 func getUserStructValues() url.Values { 20 return url.Values{ 21 "fname": []string{"Joey"}, 22 "lname": []string{"Bloggs"}, 23 "email": []string{"joeybloggs@gmail.com"}, 24 "age": []string{"32"}, 25 } 26 } 27 28 func BenchmarkSimpleUserStruct(b *testing.B) { 29 30 values := getUserStructValues() 31 decoder := form.NewDecoder() 32 var err error 33 b.ReportAllocs() 34 for n := 0; n < b.N; n++ { 35 var test User 36 if err = decoder.Decode(&test, values); err != nil { 37 b.Error(err) 38 } 39 } 40 } 41 42 func BenchmarkSimpleUserStructParallel(b *testing.B) { 43 44 values := getUserStructValues() 45 decoder := form.NewDecoder() 46 var err error 47 48 b.ReportAllocs() 49 b.RunParallel(func(pb *testing.PB) { 50 for pb.Next() { 51 var test User 52 if err = decoder.Decode(&test, values); err != nil { 53 b.Error(err) 54 } 55 } 56 }) 57 } 58 59 // Primitives ALL types 60 61 type PrimitivesStruct struct { 62 String string 63 Int int 64 Int8 int8 65 Int16 int16 66 Int32 int32 67 Int64 int64 68 Uint uint 69 Uint8 uint8 70 Uint16 uint16 71 Uint32 uint32 72 Uint64 uint64 73 Float32 float32 74 Float64 float64 75 Bool bool 76 } 77 78 func getPrimitivesStructValues() url.Values { 79 return url.Values{ 80 "String": []string{"joeybloggs"}, 81 "Int": []string{"1"}, 82 "Int8": []string{"2"}, 83 "Int16": []string{"3"}, 84 "Int32": []string{"4"}, 85 "Int64": []string{"5"}, 86 "Uint": []string{"1"}, 87 "Uint8": []string{"2"}, 88 "Uint16": []string{"3"}, 89 "Uint32": []string{"4"}, 90 "Uint64": []string{"5"}, 91 "Float32": []string{"1.1"}, 92 "Float64": []string{"5.0"}, 93 "Bool": []string{"true"}, 94 } 95 } 96 97 func BenchmarkPrimitivesStructAllPrimitivesTypes(b *testing.B) { 98 values := getPrimitivesStructValues() 99 decoder := form.NewDecoder() 100 var err error 101 102 b.ReportAllocs() 103 for n := 0; n < b.N; n++ { 104 var test PrimitivesStruct 105 if err = decoder.Decode(&test, values); err != nil { 106 b.Error(err) 107 } 108 } 109 } 110 111 func BenchmarkPrimitivesStructAllPrimitivesTypesParallel(b *testing.B) { 112 values := getPrimitivesStructValues() 113 decoder := form.NewDecoder() 114 var err error 115 116 b.ReportAllocs() 117 b.RunParallel(func(pb *testing.PB) { 118 for pb.Next() { 119 var test PrimitivesStruct 120 if err = decoder.Decode(&test, values); err != nil { 121 b.Error(err) 122 } 123 } 124 }) 125 } 126 127 // Complex Array ALL types 128 129 type ComplexArrayStruct struct { 130 String []string 131 StringPtr []*string 132 Int []int 133 IntPtr []*int 134 Int8 []int8 135 Int8Ptr []*int8 136 Int16 []int16 137 Int16Ptr []*int16 138 Int32 []int32 139 Int32Ptr []*int32 140 Int64 []int64 141 Int64Ptr []*int64 142 Uint []uint 143 UintPtr []*uint 144 Uint8 []uint8 145 Uint8Ptr []*uint8 146 Uint16 []uint16 147 Uint16Ptr []*uint16 148 Uint32 []uint32 149 Uint32Ptr []*uint32 150 Uint64 []uint64 151 Uint64Ptr []*uint64 152 NestedInt [][]int 153 NestedIntPtr [][]*int 154 } 155 156 func getComplexArrayStructValues() url.Values { 157 return url.Values{ 158 "String": []string{"joeybloggs"}, 159 "StringPtr": []string{"joeybloggs"}, 160 "Int": []string{"1", "2"}, 161 "IntPtr": []string{"1", "2"}, 162 "Int8[0]": []string{"1"}, 163 "Int8[1]": []string{"2"}, 164 "Int8Ptr[0]": []string{"1"}, 165 "Int8Ptr[1]": []string{"2"}, 166 "Int16": []string{"1", "2"}, 167 "Int16Ptr": []string{"1", "2"}, 168 "Int32": []string{"1", "2"}, 169 "Int32Ptr": []string{"1", "2"}, 170 "Int64": []string{"1", "2"}, 171 "Int64Ptr": []string{"1", "2"}, 172 "Uint": []string{"1", "2"}, 173 "UintPtr": []string{"1", "2"}, 174 "Uint8[0]": []string{"1"}, 175 "Uint8[1]": []string{"2"}, 176 "Uint8Ptr[0]": []string{"1"}, 177 "Uint8Ptr[1]": []string{"2"}, 178 "Uint16": []string{"1", "2"}, 179 "Uint16Ptr": []string{"1", "2"}, 180 "Uint32": []string{"1", "2"}, 181 "Uint32Ptr": []string{"1", "2"}, 182 "Uint64": []string{"1", "2"}, 183 "Uint64Ptr": []string{"1", "2"}, 184 "NestedInt[0][0]": []string{"1"}, 185 "NestedIntPtr[0][1]": []string{"1"}, 186 } 187 } 188 189 func BenchmarkComplexArrayStructAllTypes(b *testing.B) { 190 values := getComplexArrayStructValues() 191 decoder := form.NewDecoder() 192 var err error 193 194 b.ReportAllocs() 195 for n := 0; n < b.N; n++ { 196 var test ComplexArrayStruct 197 if err = decoder.Decode(&test, values); err != nil { 198 b.Error(err) 199 } 200 } 201 } 202 203 func BenchmarkComplexArrayStructAllTypesParallel(b *testing.B) { 204 values := getComplexArrayStructValues() 205 decoder := form.NewDecoder() 206 var err error 207 208 b.ReportAllocs() 209 b.RunParallel(func(pb *testing.PB) { 210 for pb.Next() { 211 var test ComplexArrayStruct 212 if err = decoder.Decode(&test, values); err != nil { 213 b.Error(err) 214 } 215 } 216 }) 217 } 218 219 // Complex Map ALL types 220 221 type ComplexMapStruct struct { 222 String map[string]string 223 StringPtr map[*string]*string 224 Int map[int]int 225 IntPtr map[*int]*int 226 Int8 map[int8]int8 227 Int8Ptr map[*int8]*int8 228 Int16 map[int16]int16 229 Int16Ptr map[*int16]*int16 230 Int32 map[int32]int32 231 Int32Ptr map[*int32]*int32 232 Int64 map[int64]int64 233 Int64Ptr map[*int64]*int64 234 Uint map[uint]uint 235 UintPtr map[*uint]*uint 236 Uint8 map[uint8]uint8 237 Uint8Ptr map[*uint8]*uint8 238 Uint16 map[uint16]uint16 239 Uint16Ptr map[*uint16]*uint16 240 Uint32 map[*uint32]*uint32 241 Uint32Ptr map[*uint32]*uint32 242 Uint64 map[*uint64]*uint64 243 Uint64Ptr map[*uint64]*uint64 244 NestedInt map[int]map[int]int 245 NestedIntPtr map[*int]map[*int]*int 246 } 247 248 func getComplexMapStructValues() url.Values { 249 return url.Values{ 250 "String[key]": []string{"value"}, 251 "StringPtr[key]": []string{"value"}, 252 "Int[0]": []string{"1"}, 253 "IntPtr[0]": []string{"1"}, 254 "Int8[0]": []string{"1"}, 255 "Int8Ptr[0]": []string{"1"}, 256 "Int16[0]": []string{"1"}, 257 "Int16Ptr[0]": []string{"1"}, 258 "Int32[0]": []string{"1"}, 259 "Int32Ptr[0]": []string{"1"}, 260 "Int64[0]": []string{"1"}, 261 "Int64Ptr[0]": []string{"1"}, 262 "Uint[0]": []string{"1"}, 263 "UintPtr[0]": []string{"1"}, 264 "Uint8[0]": []string{"1"}, 265 "Uint8Ptr[0]": []string{"1"}, 266 "Uint16[0]": []string{"1"}, 267 "Uint16Ptr[0]": []string{"1"}, 268 "Uint32[0]": []string{"1"}, 269 "Uint32Ptr[0]": []string{"1"}, 270 "Uint64[0]": []string{"1"}, 271 "Uint64Ptr[0]": []string{"1"}, 272 "NestedInt[1][2]": []string{"3"}, 273 "NestedIntPtr[1][2]": []string{"3"}, 274 } 275 } 276 277 func BenchmarkComplexMapStructAllTypes(b *testing.B) { 278 values := getComplexMapStructValues() 279 decoder := form.NewDecoder() 280 var err error 281 282 b.ReportAllocs() 283 for n := 0; n < b.N; n++ { 284 var test ComplexMapStruct 285 if err = decoder.Decode(&test, values); err != nil { 286 b.Error(err) 287 } 288 } 289 } 290 291 func BenchmarkComplexMapStructAllTypesParallel(b *testing.B) { 292 values := getComplexMapStructValues() 293 decoder := form.NewDecoder() 294 var err error 295 296 b.ReportAllocs() 297 b.RunParallel(func(pb *testing.PB) { 298 for pb.Next() { 299 var test ComplexMapStruct 300 if err = decoder.Decode(&test, values); err != nil { 301 b.Error(err) 302 } 303 } 304 }) 305 } 306 307 // NestedStruct Benchmarks 308 309 type Nested2 struct { 310 Value string 311 Nested2 *Nested2 312 } 313 314 type Nested struct { 315 Value string 316 } 317 318 type NestedStruct struct { 319 Nested 320 NestedArray []Nested 321 NestedPtrArray []*Nested 322 Nested2 Nested2 323 } 324 325 func getNestedStructValues() url.Values { 326 return url.Values{ 327 // Nested Field 328 "Value": []string{"value"}, 329 // Nested Array 330 "NestedArray[0].Value": []string{"value"}, 331 "NestedArray[1].Value": []string{"value"}, 332 // Nested Array Ptr 333 "NestedPtrArray[0].Value": []string{"value"}, 334 "NestedPtrArray[1].Value": []string{"value"}, 335 // Nested 2 336 "Nested2.Value": []string{"value"}, 337 "Nested2.Nested2.Value": []string{"value"}, 338 } 339 } 340 341 func BenchmarkArrayMapNestedStruct(b *testing.B) { 342 343 values := getNestedStructValues() 344 decoder := form.NewDecoder() 345 var err error 346 b.ReportAllocs() 347 for n := 0; n < b.N; n++ { 348 var test NestedStruct 349 if err = decoder.Decode(&test, values); err != nil { 350 b.Error(err) 351 } 352 } 353 } 354 355 func BenchmarkArrayMapNestedStructParallel(b *testing.B) { 356 357 values := getNestedStructValues() 358 decoder := form.NewDecoder() 359 var err error 360 361 b.ReportAllocs() 362 b.RunParallel(func(pb *testing.PB) { 363 for pb.Next() { 364 var test NestedStruct 365 if err = decoder.Decode(&test, values); err != nil { 366 b.Error(err) 367 } 368 } 369 }) 370 }