1
16
17 package serializer
18
19 import (
20 "crypto/rand"
21 "io/ioutil"
22 "testing"
23
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 testapigroupv1 "k8s.io/apimachinery/pkg/apis/testapigroup/v1"
26 "k8s.io/apimachinery/pkg/runtime"
27 "k8s.io/apimachinery/pkg/runtime/schema"
28 "k8s.io/apimachinery/pkg/runtime/serializer/protobuf"
29 )
30
31 func BenchmarkProtobufEncoder(b *testing.B) {
32 benchmarkEncodeFor(b, protobuf.NewSerializer(nil, nil))
33 }
34
35 func BenchmarkProtobufEncodeWithAllocator(b *testing.B) {
36 benchmarkEncodeWithAllocatorFor(b, protobuf.NewSerializer(nil, nil))
37 }
38
39 func BenchmarkRawProtobufEncoder(b *testing.B) {
40 benchmarkEncodeFor(b, protobuf.NewRawSerializer(nil, nil))
41 }
42
43 func BenchmarkRawProtobufEncodeWithAllocator(b *testing.B) {
44 benchmarkEncodeWithAllocatorFor(b, protobuf.NewRawSerializer(nil, nil))
45 }
46
47 func benchmarkEncodeFor(b *testing.B, target runtime.Encoder) {
48 for _, tc := range benchTestCases() {
49 b.Run(tc.name, func(b *testing.B) {
50 b.ReportAllocs()
51 for n := 0; n < b.N; n++ {
52 err := target.Encode(tc.obj, ioutil.Discard)
53 if err != nil {
54 b.Fatal(err)
55 }
56 }
57 })
58 }
59 }
60
61 func benchmarkEncodeWithAllocatorFor(b *testing.B, target runtime.EncoderWithAllocator) {
62 for _, tc := range benchTestCases() {
63 b.Run(tc.name, func(b *testing.B) {
64 b.ReportAllocs()
65 allocator := &runtime.Allocator{}
66 for n := 0; n < b.N; n++ {
67 err := target.EncodeWithAllocator(tc.obj, ioutil.Discard, allocator)
68 if err != nil {
69 b.Fatal(err)
70 }
71 }
72 })
73 }
74 }
75
76 type benchTestCase struct {
77 name string
78 obj runtime.Object
79 }
80
81 func benchTestCases() []benchTestCase {
82 return []benchTestCase{
83 {
84 name: "an obj with 1kB payload",
85 obj: func() runtime.Object {
86 carpPayload := make([]byte, 1000)
87 if _, err := rand.Read(carpPayload); err != nil {
88 panic(err)
89 }
90 return carpWithPayload(carpPayload)
91 }(),
92 },
93 {
94 name: "an obj with 10kB payload",
95 obj: func() runtime.Object {
96 carpPayload := make([]byte, 10000)
97 if _, err := rand.Read(carpPayload); err != nil {
98 panic(err)
99 }
100 return carpWithPayload(carpPayload)
101 }(),
102 },
103 {
104 name: "an obj with 100kB payload",
105 obj: func() runtime.Object {
106 carpPayload := make([]byte, 100000)
107 if _, err := rand.Read(carpPayload); err != nil {
108 panic(err)
109 }
110 return carpWithPayload(carpPayload)
111 }(),
112 },
113 {
114 name: "an obj with 1MB payload",
115 obj: func() runtime.Object {
116 carpPayload := make([]byte, 1000000)
117 if _, err := rand.Read(carpPayload); err != nil {
118 panic(err)
119 }
120 return carpWithPayload(carpPayload)
121 }(),
122 },
123 }
124 }
125
126 func carpWithPayload(carpPayload []byte) *testapigroupv1.Carp {
127 gvk := &schema.GroupVersionKind{Group: "group", Version: "version", Kind: "Carp"}
128 return &testapigroupv1.Carp{
129 TypeMeta: metav1.TypeMeta{APIVersion: gvk.GroupVersion().String(), Kind: gvk.Kind},
130 ObjectMeta: metav1.ObjectMeta{
131 Name: "name",
132 Namespace: "namespace",
133 },
134 Spec: testapigroupv1.CarpSpec{
135 Subdomain: "carp.k8s.io",
136 NodeSelector: map[string]string{"payload": string(carpPayload)},
137 },
138 }
139 }
140
View as plain text