Skip to content

Commit f2f24ea

Browse files
committed
peformance tuning
Signed-off-by: Tim Ramlot <[email protected]>
1 parent e4c71fb commit f2f24ea

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

fieldpath/serialize-pe.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ limitations under the License.
1717
package fieldpath
1818

1919
import (
20+
"bytes"
2021
"errors"
2122
"fmt"
2223
"strconv"
23-
"strings"
2424

2525
"github.com/go-json-experiment/json"
2626
"sigs.k8s.io/structured-merge-diff/v6/value"
@@ -97,36 +97,45 @@ func DeserializePathElement(s string) (PathElement, error) {
9797

9898
// SerializePathElement serializes a path element
9999
func SerializePathElement(pe PathElement) (string, error) {
100-
builder := strings.Builder{}
100+
builder := bytes.Buffer{}
101+
if err := serializePathElementBuilder(pe, &builder); err != nil {
102+
return "", err
103+
}
104+
return builder.String(), nil
105+
}
101106

107+
func serializePathElementBuilder(pe PathElement, builder *bytes.Buffer) error {
102108
switch {
103109
case pe.FieldName != nil:
104110
if _, err := builder.Write(peFieldSepBytes); err != nil {
105-
return "", err
111+
return err
112+
}
113+
if _, err := builder.WriteString(*pe.FieldName); err != nil {
114+
return err
106115
}
107-
builder.WriteString(*pe.FieldName)
108116
case pe.Key != nil:
109117
if _, err := builder.Write(peKeySepBytes); err != nil {
110-
return "", err
118+
return err
111119
}
112-
if err := json.MarshalWrite(&builder, *pe.Key, json.Deterministic(true)); err != nil {
113-
return "", err
120+
if err := json.MarshalWrite(builder, pe.Key, json.Deterministic(true)); err != nil {
121+
return err
114122
}
115123
case pe.Value != nil:
116124
if _, err := builder.Write(peValueSepBytes); err != nil {
117-
return "", err
125+
return err
118126
}
119-
if err := json.MarshalWrite(&builder, (*pe.Value).Unstructured(), json.Deterministic(true)); err != nil {
120-
return "", err
127+
if err := json.MarshalWrite(builder, (*pe.Value).Unstructured(), json.Deterministic(true)); err != nil {
128+
return err
121129
}
122130
case pe.Index != nil:
123131
if _, err := builder.Write(peIndexSepBytes); err != nil {
124-
return "", err
132+
return err
133+
}
134+
if _, err := builder.WriteString(strconv.Itoa(*pe.Index)); err != nil {
135+
return err
125136
}
126-
builder.WriteString(strconv.Itoa(*pe.Index))
127137
default:
128-
return "", errors.New("invalid PathElement")
138+
return errors.New("invalid PathElement")
129139
}
130-
131-
return builder.String(), nil
140+
return nil
132141
}

fieldpath/serialize.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ limitations under the License.
1717
package fieldpath
1818

1919
import (
20+
"bytes"
2021
"fmt"
2122
"io"
2223
"sort"
24+
"sync"
2325

2426
"github.com/go-json-experiment/json"
2527
"github.com/go-json-experiment/json/jsontext"
@@ -33,13 +35,24 @@ func (s *Set) ToJSONStream(w io.Writer) error {
3335
return json.MarshalWrite(w, (*setContentsV1)(s))
3436
}
3537

38+
var pool = sync.Pool{
39+
New: func() any {
40+
return &bytes.Buffer{}
41+
},
42+
}
43+
3644
func writePathKey(enc *jsontext.Encoder, pe PathElement) error {
37-
key, err := SerializePathElement(pe)
38-
if err != nil {
45+
builder := pool.Get().(*bytes.Buffer)
46+
defer func() {
47+
builder.Reset()
48+
pool.Put(builder)
49+
}()
50+
51+
if err := serializePathElementBuilder(pe, builder); err != nil {
3952
return err
4053
}
4154

42-
if err := enc.WriteToken(jsontext.String(key)); err != nil {
55+
if err := enc.WriteToken(jsontext.String(builder.String())); err != nil {
4356
return err
4457
}
4558
return nil

0 commit comments

Comments
 (0)