1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage proto_test 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "flag" 9*1c12ee1eSDan Willemsen "fmt" 10*1c12ee1eSDan Willemsen "reflect" 11*1c12ee1eSDan Willemsen "testing" 12*1c12ee1eSDan Willemsen 13*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 14*1c12ee1eSDan Willemsen) 15*1c12ee1eSDan Willemsen 16*1c12ee1eSDan Willemsen// The results of these microbenchmarks are unlikely to correspond well 17*1c12ee1eSDan Willemsen// to real world performance. They are mainly useful as a quick check to 18*1c12ee1eSDan Willemsen// detect unexpected regressions and for profiling specific cases. 19*1c12ee1eSDan Willemsen 20*1c12ee1eSDan Willemsenvar ( 21*1c12ee1eSDan Willemsen allowPartial = flag.Bool("allow_partial", false, "set AllowPartial") 22*1c12ee1eSDan Willemsen) 23*1c12ee1eSDan Willemsen 24*1c12ee1eSDan Willemsen// BenchmarkEncode benchmarks encoding all the test messages. 25*1c12ee1eSDan Willemsenfunc BenchmarkEncode(b *testing.B) { 26*1c12ee1eSDan Willemsen for _, test := range testValidMessages { 27*1c12ee1eSDan Willemsen for _, want := range test.decodeTo { 28*1c12ee1eSDan Willemsen opts := proto.MarshalOptions{AllowPartial: *allowPartial} 29*1c12ee1eSDan Willemsen b.Run(fmt.Sprintf("%s (%T)", test.desc, want), func(b *testing.B) { 30*1c12ee1eSDan Willemsen b.RunParallel(func(pb *testing.PB) { 31*1c12ee1eSDan Willemsen for pb.Next() { 32*1c12ee1eSDan Willemsen _, err := opts.Marshal(want) 33*1c12ee1eSDan Willemsen if err != nil && !test.partial { 34*1c12ee1eSDan Willemsen b.Fatal(err) 35*1c12ee1eSDan Willemsen } 36*1c12ee1eSDan Willemsen } 37*1c12ee1eSDan Willemsen }) 38*1c12ee1eSDan Willemsen }) 39*1c12ee1eSDan Willemsen } 40*1c12ee1eSDan Willemsen } 41*1c12ee1eSDan Willemsen} 42*1c12ee1eSDan Willemsen 43*1c12ee1eSDan Willemsen// BenchmarkDecode benchmarks decoding all the test messages. 44*1c12ee1eSDan Willemsenfunc BenchmarkDecode(b *testing.B) { 45*1c12ee1eSDan Willemsen for _, test := range testValidMessages { 46*1c12ee1eSDan Willemsen for _, want := range test.decodeTo { 47*1c12ee1eSDan Willemsen opts := proto.UnmarshalOptions{AllowPartial: *allowPartial} 48*1c12ee1eSDan Willemsen b.Run(fmt.Sprintf("%s (%T)", test.desc, want), func(b *testing.B) { 49*1c12ee1eSDan Willemsen b.RunParallel(func(pb *testing.PB) { 50*1c12ee1eSDan Willemsen for pb.Next() { 51*1c12ee1eSDan Willemsen m := reflect.New(reflect.TypeOf(want).Elem()).Interface().(proto.Message) 52*1c12ee1eSDan Willemsen err := opts.Unmarshal(test.wire, m) 53*1c12ee1eSDan Willemsen if err != nil && !test.partial { 54*1c12ee1eSDan Willemsen b.Fatal(err) 55*1c12ee1eSDan Willemsen } 56*1c12ee1eSDan Willemsen } 57*1c12ee1eSDan Willemsen }) 58*1c12ee1eSDan Willemsen }) 59*1c12ee1eSDan Willemsen } 60*1c12ee1eSDan Willemsen } 61*1c12ee1eSDan Willemsen} 62