Home | History | Annotate | Download | only in proto
      1 // Go support for Protocol Buffers - Google's data interchange format
      2 //
      3 // Copyright 2010 The Go Authors.  All rights reserved.
      4 // https://github.com/golang/protobuf
      5 //
      6 // Redistribution and use in source and binary forms, with or without
      7 // modification, are permitted provided that the following conditions are
      8 // met:
      9 //
     10 //     * Redistributions of source code must retain the above copyright
     11 // notice, this list of conditions and the following disclaimer.
     12 //     * Redistributions in binary form must reproduce the above
     13 // copyright notice, this list of conditions and the following disclaimer
     14 // in the documentation and/or other materials provided with the
     15 // distribution.
     16 //     * Neither the name of Google Inc. nor the names of its
     17 // contributors may be used to endorse or promote products derived from
     18 // this software without specific prior written permission.
     19 //
     20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31 
     32 // +build go1.7
     33 
     34 package proto_test
     35 
     36 import (
     37 	"strconv"
     38 	"testing"
     39 
     40 	"github.com/golang/protobuf/proto"
     41 	tpb "github.com/golang/protobuf/proto/proto3_proto"
     42 	"github.com/golang/protobuf/ptypes"
     43 )
     44 
     45 var (
     46 	blackhole []byte
     47 )
     48 
     49 // BenchmarkAny creates increasingly large arbitrary Any messages.  The type is always the
     50 // same.
     51 func BenchmarkAny(b *testing.B) {
     52 	data := make([]byte, 1<<20)
     53 	quantum := 1 << 10
     54 	for i := uint(0); i <= 10; i++ {
     55 		b.Run(strconv.Itoa(quantum<<i), func(b *testing.B) {
     56 			for k := 0; k < b.N; k++ {
     57 				inner := &tpb.Message{
     58 					Data: data[:quantum<<i],
     59 				}
     60 				outer, err := ptypes.MarshalAny(inner)
     61 				if err != nil {
     62 					b.Error("wrong encode", err)
     63 				}
     64 				raw, err := proto.Marshal(&tpb.Message{
     65 					Anything: outer,
     66 				})
     67 				if err != nil {
     68 					b.Error("wrong encode", err)
     69 				}
     70 				blackhole = raw
     71 			}
     72 		})
     73 	}
     74 }
     75 
     76 // BenchmarkEmpy measures the overhead of doing the minimal possible encode.
     77 func BenchmarkEmpy(b *testing.B) {
     78 	for i := 0; i < b.N; i++ {
     79 		raw, err := proto.Marshal(&tpb.Message{})
     80 		if err != nil {
     81 			b.Error("wrong encode", err)
     82 		}
     83 		blackhole = raw
     84 	}
     85 }
     86