...

Source file src/k8s.io/cli-runtime/pkg/printers/bench_test.go

Documentation: k8s.io/cli-runtime/pkg/printers

     1  /*
     2  Copyright 2022 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    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