Skip to content

Commit c076bfc

Browse files
committed
Avoid unnecessary identifier computations
1 parent 3ad42fb commit c076bfc

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"encoding/json"
2121
"io"
2222
"reflect"
23+
"sync"
2324

2425
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2526
"k8s.io/apimachinery/pkg/runtime"
@@ -88,21 +89,34 @@ type codec struct {
8889
originalSchemeName string
8990
}
9091

92+
var identifiersMap sync.Map
93+
94+
type codecIdentifier struct {
95+
EncodeGV string `json:"encodeGV,omitempty"`
96+
Encoder string `json:"encoder,omitempty"`
97+
Name string `json:"name,omitempty"`
98+
}
99+
91100
// identifier computes Identifier of Encoder based on codec parameters.
92101
func identifier(encodeGV runtime.GroupVersioner, encoder runtime.Encoder) runtime.Identifier {
93-
result := map[string]string{
94-
"name": "versioning",
102+
result := codecIdentifier{
103+
Name: "versioning",
95104
}
105+
96106
if encodeGV != nil {
97-
result["encodeGV"] = encodeGV.Identifier()
107+
result.EncodeGV = encodeGV.Identifier()
98108
}
99109
if encoder != nil {
100-
result["encoder"] = string(encoder.Identifier())
110+
result.Encoder = string(encoder.Identifier())
111+
}
112+
if id, ok := identifiersMap.Load(result); ok {
113+
return id.(runtime.Identifier)
101114
}
102115
identifier, err := json.Marshal(result)
103116
if err != nil {
104117
klog.Fatalf("Failed marshaling identifier for codec: %v", err)
105118
}
119+
identifiersMap.Store(result, runtime.Identifier(identifier))
106120
return runtime.Identifier(identifier)
107121
}
108122

staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,16 @@ func TestCacheableObject(t *testing.T) {
381381

382382
runtimetesting.CacheableObjectTest(t, encoder)
383383
}
384+
385+
func BenchmarkIdentifier(b *testing.B) {
386+
encoder := &mockSerializer{}
387+
gv := schema.GroupVersion{Group: "group", Version: "version"}
388+
389+
for i := 0; i < b.N; i++ {
390+
id := identifier(gv, encoder)
391+
// Avoid optimizing by compiler.
392+
if id[0] != '{' {
393+
b.Errorf("unexpected identifier: %s", id)
394+
}
395+
}
396+
}

0 commit comments

Comments
 (0)