1
16
17 package printers
18
19 import (
20 "bytes"
21 "encoding/json"
22 "fmt"
23 "testing"
24
25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
27 "k8s.io/apimachinery/pkg/runtime"
28 "k8s.io/client-go/kubernetes/scheme"
29 )
30
31 func newBenchmarkList() *unstructured.UnstructuredList {
32 list := &unstructured.UnstructuredList{
33 Object: map[string]interface{}{
34 "apiVersion": "v1",
35 "kind": "PodList",
36 },
37 Items: []unstructured.Unstructured{},
38 }
39 for i := 0; i < 1000; i++ {
40 list.Items = append(list.Items, unstructured.Unstructured{
41 Object: map[string]interface{}{
42 "apiVersion": "v1",
43 "kind": "Pod",
44 "metadata": map[string]interface{}{
45 "name": fmt.Sprintf("pod%d", i),
46 "namespace": "ns",
47 "labels": map[string]interface{}{
48 "first-label": "12",
49 "second-label": "label-value",
50 },
51 },
52 },
53 })
54 }
55 return list
56 }
57
58 func newBenchmarkTable() *metav1.Table {
59 table := &metav1.Table{
60 ColumnDefinitions: []metav1.TableColumnDefinition{
61 {Name: "Name", Type: "string"},
62 {Name: "Ready", Type: "string"},
63 {Name: "Status", Type: "string"},
64 {Name: "Retries", Type: "integer"},
65 {Name: "Age", Type: "string"},
66 },
67 Rows: []metav1.TableRow{},
68 }
69 for _, pod := range newBenchmarkList().Items {
70 raw, _ := json.Marshal(pod)
71 table.Rows = append(table.Rows, metav1.TableRow{
72 Cells: []interface{}{pod.GetName(), "1/1", "Ready", int64(0), "20h"},
73 Object: runtime.RawExtension{
74 Raw: raw,
75 Object: &pod,
76 },
77 })
78 }
79 return table
80 }
81
82 func BenchmarkDiscardingPrinter(b *testing.B) {
83 data := newBenchmarkList()
84 b.ResetTimer()
85 benchmarkPrinter(b, func() ResourcePrinter { return NewDiscardingPrinter() }, data)
86 }
87
88 func BenchmarkJSONPrinter(b *testing.B) {
89 data := newBenchmarkList()
90 b.ResetTimer()
91 benchmarkPrinter(b, func() ResourcePrinter { return &JSONPrinter{} }, data)
92 }
93
94 func BenchmarkJSONPathPrinter(b *testing.B) {
95 data := newBenchmarkList()
96 b.ResetTimer()
97 benchmarkPrinter(b, func() ResourcePrinter {
98 printer, _ := NewJSONPathPrinter("{range .items[*]}{.metadata.name}\n{end}")
99 return printer
100 }, data)
101 }
102
103 func BenchmarkYAMLPrinter(b *testing.B) {
104 data := newBenchmarkList()
105 b.ResetTimer()
106 benchmarkPrinter(b, func() ResourcePrinter { return &YAMLPrinter{} }, data)
107 }
108
109 func BenchmarkTablePrinter(b *testing.B) {
110 data := newBenchmarkTable()
111 b.ResetTimer()
112 benchmarkPrinter(b, func() ResourcePrinter { return NewTablePrinter(PrintOptions{}) }, data)
113 }
114
115 func BenchmarkGoTemplatePrinter(b *testing.B) {
116 data := newBenchmarkList()
117 b.ResetTimer()
118 benchmarkPrinter(b, func() ResourcePrinter {
119 printer, _ := NewGoTemplatePrinter([]byte("{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}"))
120 return printer
121 }, data)
122 }
123
124 func BenchmarkNamePrinter(b *testing.B) {
125 data := newBenchmarkList()
126 b.ResetTimer()
127 benchmarkPrinter(b, func() ResourcePrinter { return &NamePrinter{} }, data)
128 }
129
130 func BenchmarkOmitManagedFieldsPrinter(b *testing.B) {
131 data := newBenchmarkList()
132 b.ResetTimer()
133 benchmarkPrinter(b, func() ResourcePrinter { return &OmitManagedFieldsPrinter{Delegate: NewDiscardingPrinter()} }, data)
134 }
135
136 func BenchmarkTypeSetterPrinter(b *testing.B) {
137 data := newBenchmarkList()
138 b.ResetTimer()
139 benchmarkPrinter(b, func() ResourcePrinter { return NewTypeSetter(scheme.Scheme).ToPrinter(NewDiscardingPrinter()) }, data)
140 }
141
142 func benchmarkPrinter(b *testing.B, printerFunc func() ResourcePrinter, data runtime.Object) {
143 b.ReportAllocs()
144 b.RunParallel(func(pb *testing.PB) {
145 for pb.Next() {
146 buf := &bytes.Buffer{}
147 if err := printerFunc().PrintObj(data, buf); err != nil {
148 b.Errorf("PrintObj failed: %v", err)
149 }
150 }
151 })
152 }
153
View as plain text