Skip to content

Commit

Permalink
test(bench): use Writer in OTEL encode
Browse files Browse the repository at this point in the history
  • Loading branch information
ernado committed Jan 12, 2022
1 parent 0a14eba commit 4897c44
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 56 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ goarch: amd64
pkg: github.com/go-faster/jx
cpu: AMD Ryzen 9 5950X 16-Core Processor
BenchmarkOTEL_Decode-32 674.1 ns/op 741.71 MB/s 0 B/op 0 allocs/op
BenchmarkOTEL_Encode-32 393.9 ns/op 1076.50 MB/s 0 B/op 0 allocs/op
BenchmarkOTEL_Write-32 231.0 ns/op 1835.49 MB/s 0 B/op 0 allocs/op
PASS
```

Expand Down
6 changes: 3 additions & 3 deletions num_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func TestNum(t *testing.T) {
assert.True(t, v.IsInt())
assert.False(t, v.Equal(Num{}))
})
t.Run("Encode", func(t *testing.T) {
t.Run("Write", func(t *testing.T) {
var e Encoder
e.Num(v)
require.Equal(t, e.String(), "123")
Expand Down Expand Up @@ -155,7 +155,7 @@ func TestNum(t *testing.T) {
f = 1.23
)
v := Num(s)
t.Run("Encode", func(t *testing.T) {
t.Run("Write", func(t *testing.T) {
var e Encoder
e.Num(v)
require.Equal(t, e.String(), s)
Expand Down Expand Up @@ -234,7 +234,7 @@ func BenchmarkNum(b *testing.B) {
}
}
})
b.Run("Encode", func(b *testing.B) {
b.Run("Write", func(b *testing.B) {
b.ReportAllocs()
var e Encoder
for i := 0; i < b.N; i++ {
Expand Down
82 changes: 42 additions & 40 deletions otel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,15 @@ func (m *Map) Append(k, v []byte) {
m.Values.Append(v)
}

func (m Map) Encode(e *Encoder) {
e.ObjStart()
defer e.ObjEnd()
func (m Map) Write(w *Writer) {
w.ObjStart()
defer w.ObjEnd()
_ = m.Keys.ForEachBytes(func(i int, b []byte) error {
e.FieldStart(string(b))
e.Raw(m.Values.Elem(i))
if i > 0 {
w.Comma()
}
w.FieldStart(string(b))
w.Raw(m.Values.Elem(i))
return nil
})
}
Expand Down Expand Up @@ -94,55 +97,55 @@ type OTEL struct {
Body Raw
}

func (o *OTEL) Encode(e *Encoder) {
e.ObjStart()
defer e.ObjEnd()
func (o *OTEL) Write(w *Writer) {
w.ObjStart()
defer w.ObjEnd()

e.FieldStart("Timestamp")
e.Num(o.Timestamp)
w.RawStr(`"Timestamp":`)
w.Num(o.Timestamp)

e.FieldStart("Attributes")
o.Attributes.Encode(e)
w.RawStr(`,"Attributes":`)
o.Attributes.Write(w)

e.FieldStart("Resource")
o.Resource.Encode(e)
w.RawStr(`,"Resource":`)
o.Resource.Write(w)

{
// Hex encoding.
buf := make([]byte, 32) // 32 = 16 * 2
var n int

n = hex.Encode(buf, o.TraceID[:])
e.FieldStart("TraceId")
e.Str(string(buf[:n]))
w.RawStr(`,"TraceId":`)
w.Str(string(buf[:n]))

n = hex.Encode(buf, o.SpanID[:])
e.FieldStart("SpanId")
e.Str(string(buf[:n]))
w.RawStr(`,"SpanId":`)
w.Str(string(buf[:n]))
}

if o.Severity > 0 && o.Severity <= 24 {
e.FieldStart("SeverityText")
w.RawStr(`,"SeverityText":`)
switch {
case o.Severity >= 1 && o.Severity <= 4:
e.Str("TRACE")
w.RawStr(`"TRACE"`)
case o.Severity >= 5 && o.Severity <= 8:
e.Str("DEBUG")
w.RawStr(`"DEBUG"`)
case o.Severity >= 9 && o.Severity <= 12:
e.Str("INFO")
w.RawStr(`"INFO"`)
case o.Severity >= 13 && o.Severity <= 16:
e.Str("WARN")
w.RawStr(`"WARN"`)
case o.Severity >= 17 && o.Severity <= 20:
e.Str("ERROR")
w.RawStr(`"ERROR"`)
case o.Severity >= 21 && o.Severity <= 24:
e.Str("FATAL")
w.RawStr(`"FATAL"`)
}
e.FieldStart("SeverityNumber")
e.UInt8(o.Severity)
w.RawStr(`,"SeverityNumber":`)
w.UInt8(o.Severity)
}

e.FieldStart("Body")
e.Raw(o.Body)
w.RawStr(`,"Body":`)
w.Raw(o.Body)
}

func (o *OTEL) Decode(d *Decoder) error {
Expand Down Expand Up @@ -223,12 +226,11 @@ func TestOTELDecode(t *testing.T) {
var v OTEL
require.NoError(t, v.Decode(d))

t.Run("Encode", func(t *testing.T) {
var e Encoder
e.SetIdent(2)
v.Encode(&e)
t.Run("Write", func(t *testing.T) {
var w Writer
v.Write(&w)

require.JSONEq(t, string(otelEx1), e.String())
require.JSONEq(t, string(otelEx1), w.String())
})
}

Expand All @@ -247,19 +249,19 @@ func BenchmarkOTEL_Decode(b *testing.B) {
}
}

func BenchmarkOTEL_Encode(b *testing.B) {
func BenchmarkOTEL_Write(b *testing.B) {
d := DecodeBytes(otelEx1)
var v OTEL

require.NoError(b, v.Decode(d))

b.ReportAllocs()
e := GetEncoder()
v.Encode(e)
b.SetBytes(int64(len(e.Bytes())))
var w Writer
v.Write(&w)
b.SetBytes(int64(len(w.Buf)))

for i := 0; i < b.N; i++ {
e.Reset()
v.Encode(e)
w.Reset()
v.Write(&w)
}
}
21 changes: 9 additions & 12 deletions w.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,7 @@ func (w *Writer) Bool(v bool) {
}
}

// ObjStart writes object start, performing indentation if needed.
//
// Use Obj as convenience helper for writing objects.
// ObjStart writes object start.
func (w *Writer) ObjStart() {
w.byte('{')
}
Expand All @@ -91,23 +89,22 @@ func (w *Writer) FieldStart(field string) {
w.byte(':')
}

// ObjEnd writes end of object token, performing indentation if needed.
//
// Use Obj as convenience helper for writing objects.
// ObjEnd writes end of object token.
func (w *Writer) ObjEnd() {
w.byte('}')
}

// ArrStart writes start of array, performing indentation if needed.
//
// Use Arr as convenience helper for writing arrays.
// ArrStart writes start of array.
func (w *Writer) ArrStart() {
w.byte('[')
}

// ArrEnd writes end of array, performing indentation if needed.
//
// Use Arr as convenience helper for writing arrays.
// ArrEnd writes end of array.
func (w *Writer) ArrEnd() {
w.byte(']')
}

// Comma writes comma.
func (w *Writer) Comma() {
w.byte(',')
}

0 comments on commit 4897c44

Please sign in to comment.