Avoid unnecessary identifier computations

This commit is contained in:
wojtekt 2019-10-03 17:17:58 +02:00
parent 3ad42fb8ca
commit c076bfc495
2 changed files with 31 additions and 4 deletions

View File

@ -20,6 +20,7 @@ import (
"encoding/json"
"io"
"reflect"
"sync"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
@ -88,21 +89,34 @@ type codec struct {
originalSchemeName string
}
var identifiersMap sync.Map
type codecIdentifier struct {
EncodeGV string `json:"encodeGV,omitempty"`
Encoder string `json:"encoder,omitempty"`
Name string `json:"name,omitempty"`
}
// identifier computes Identifier of Encoder based on codec parameters.
func identifier(encodeGV runtime.GroupVersioner, encoder runtime.Encoder) runtime.Identifier {
result := map[string]string{
"name": "versioning",
result := codecIdentifier{
Name: "versioning",
}
if encodeGV != nil {
result["encodeGV"] = encodeGV.Identifier()
result.EncodeGV = encodeGV.Identifier()
}
if encoder != nil {
result["encoder"] = string(encoder.Identifier())
result.Encoder = string(encoder.Identifier())
}
if id, ok := identifiersMap.Load(result); ok {
return id.(runtime.Identifier)
}
identifier, err := json.Marshal(result)
if err != nil {
klog.Fatalf("Failed marshaling identifier for codec: %v", err)
}
identifiersMap.Store(result, runtime.Identifier(identifier))
return runtime.Identifier(identifier)
}

View File

@ -381,3 +381,16 @@ func TestCacheableObject(t *testing.T) {
runtimetesting.CacheableObjectTest(t, encoder)
}
func BenchmarkIdentifier(b *testing.B) {
encoder := &mockSerializer{}
gv := schema.GroupVersion{Group: "group", Version: "version"}
for i := 0; i < b.N; i++ {
id := identifier(gv, encoder)
// Avoid optimizing by compiler.
if id[0] != '{' {
b.Errorf("unexpected identifier: %s", id)
}
}
}