diff options
Diffstat (limited to 'src/encoding/json')
| -rw-r--r-- | src/encoding/json/bench_test.go | 17 | ||||
| -rw-r--r-- | src/encoding/json/v2_bench_test.go | 18 | ||||
| -rw-r--r-- | src/encoding/json/v2_stream.go | 19 |
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 } |
