import (
"bytes"
+ "crypto/sha256"
"fmt"
"internal/testenv"
"internal/zstd"
}
}
}
+
+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)
+ }
+ }
+}
import (
"bytes"
+ "crypto/sha256"
+ "fmt"
"io"
"strings"
"testing"
}
})
}
+
+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)
+ }
+ }
+}
opts jsonv2.Options
err error
- buf bytes.Buffer
indentBuf bytes.Buffer
indentPrefix string
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
}
// 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
}