mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 04:33:26 +00:00
Avoid unnecessary identifier computations
This commit is contained in:
parent
3ad42fb8ca
commit
c076bfc495
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user