aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/json')
-rw-r--r--src/encoding/json/bench_test.go17
-rw-r--r--src/encoding/json/v2_bench_test.go18
-rw-r--r--src/encoding/json/v2_stream.go19
3 files changed, 46 insertions, 8 deletions
diff --git a/src/encoding/json/bench_test.go b/src/encoding/json/bench_test.go
index 047188131c..4e3bfe8bd2 100644
--- a/src/encoding/json/bench_test.go
+++ b/src/encoding/json/bench_test.go
@@ -14,6 +14,7 @@ package json
import (
"bytes"
+ "crypto/sha256"
"fmt"
"internal/testenv"
"internal/zstd"
@@ -581,3 +582,19 @@ func BenchmarkUnmarshalNumber(b *testing.B) {
}
}
}
+
+func BenchmarkNewEncoderEncode(b *testing.B) {
+ m := make(map[string]string)
+ for i := range 100_000 {
+ k := fmt.Sprintf("key%d", i)
+ v := fmt.Sprintf("%x", sha256.Sum256([]byte(k)))
+ m[k] = v
+ }
+ b.ResetTimer()
+ b.ReportAllocs()
+ for b.Loop() {
+ if err := NewEncoder(io.Discard).Encode(m); err != nil {
+ b.Fatalf("Encode error: %v", err)
+ }
+ }
+}
diff --git a/src/encoding/json/v2_bench_test.go b/src/encoding/json/v2_bench_test.go
index b9ed7b6220..7057f9bec4 100644
--- a/src/encoding/json/v2_bench_test.go
+++ b/src/encoding/json/v2_bench_test.go
@@ -14,6 +14,8 @@ package json
import (
"bytes"
+ "crypto/sha256"
+ "fmt"
"io"
"strings"
"testing"
@@ -481,3 +483,19 @@ func BenchmarkEncoderEncode(b *testing.B) {
}
})
}
+
+func BenchmarkNewEncoderEncode(b *testing.B) {
+ m := make(map[string]string)
+ for i := range 100_000 {
+ k := fmt.Sprintf("key%d", i)
+ v := fmt.Sprintf("%x", sha256.Sum256([]byte(k)))
+ m[k] = v
+ }
+ b.ResetTimer()
+ b.ReportAllocs()
+ for b.Loop() {
+ if err := NewEncoder(io.Discard).Encode(m); err != nil {
+ b.Fatalf("Encode error: %v", err)
+ }
+ }
+}
diff --git a/src/encoding/json/v2_stream.go b/src/encoding/json/v2_stream.go
index ca0822cb73..ee16629cbb 100644
--- a/src/encoding/json/v2_stream.go
+++ b/src/encoding/json/v2_stream.go
@@ -96,7 +96,6 @@ type Encoder struct {
opts jsonv2.Options
err error
- buf bytes.Buffer
indentBuf bytes.Buffer
indentPrefix string
@@ -121,21 +120,22 @@ func (enc *Encoder) Encode(v any) error {
return enc.err
}
- buf := &enc.buf
- buf.Reset()
- if err := jsonv2.MarshalWrite(buf, v, enc.opts); err != nil {
+ e := export.GetBufferedEncoder(enc.opts)
+ defer export.PutBufferedEncoder(e)
+ if err := jsonv2.MarshalEncode(e, v); err != nil {
return err
}
+ b := export.Encoder(e).Buf // b must not leak current scope
if len(enc.indentPrefix)+len(enc.indentValue) > 0 {
enc.indentBuf.Reset()
- if err := Indent(&enc.indentBuf, buf.Bytes(), enc.indentPrefix, enc.indentValue); err != nil {
+ if err := Indent(&enc.indentBuf, b, enc.indentPrefix, enc.indentValue); err != nil {
return err
}
- buf = &enc.indentBuf
+ b = enc.indentBuf.Bytes()
}
- buf.WriteByte('\n')
+ b = append(b, '\n')
- if _, err := enc.w.Write(buf.Bytes()); err != nil {
+ if _, err := enc.w.Write(b); err != nil {
enc.err = err
return err
}
@@ -146,6 +146,9 @@ func (enc *Encoder) Encode(v any) error {
// value as if indented by the package-level function Indent(dst, src, prefix, indent).
// Calling SetIndent("", "") disables indentation.
func (enc *Encoder) SetIndent(prefix, indent string) {
+ // NOTE: Do not rely on the newer [jsontext.WithIndent] option since
+ // the v1 [Indent] behavior has historical bugs that cannot be changed
+ // for backward compatibility reasons.
enc.indentPrefix = prefix
enc.indentValue = indent
}