Skip to content

Instantly share code, notes, and snippets.

@rs
Last active May 8, 2018 20:24
Show Gist options
  • Save rs/988efc55268b7d4df5ffb01a293c4bdc to your computer and use it in GitHub Desktop.
Save rs/988efc55268b7d4df5ffb01a293c4bdc to your computer and use it in GitHub Desktop.
Zero to One log benchmark
package logbench
import (
"errors"
"io/ioutil"
"testing"
"github.com/francoispqt/gojay"
"github.com/francoispqt/onelog"
)
func (o obj) MarshalObject(enc *gojay.Encoder) {
enc.AddStringKey("Pub", o.Pub)
enc.AddStringKey("Tag", o.Tag)
enc.AddIntKey("priv", o.priv)
}
func (o obj) IsNil() bool {
return false
}
func BenchmarkOnelogFields(b *testing.B) {
logger := onelog.New(ioutil.Discard, onelog.ALL)
benchmarkOnelogFields(b, logger)
}
func BenchmarkOnelogFieldsDisabled(b *testing.B) {
logger := onelog.New(ioutil.Discard, 0)
benchmarkOnelogFields(b, logger)
}
func benchmarkOnelogFields(b *testing.B, logger *onelog.Logger) {
err := errors.New("some error")
o := obj{"a", "a", 0}
b.ResetTimer()
b.Run("Bool", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.InfoWithFields("some message", func(e onelog.Entry) {
e.Bool("k", true)
})
}
})
})
b.Run("Int", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.InfoWithFields("some message", func(e onelog.Entry) {
e.Int("k", 123)
})
}
})
})
b.Run("Float", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.InfoWithFields("some message", func(e onelog.Entry) {
e.Float("k", 1.23)
})
}
})
})
b.Run("String", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.InfoWithFields("some message", func(e onelog.Entry) {
e.String("k", "foo")
})
}
})
})
b.Run("Error", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.InfoWithFields("some message", func(e onelog.Entry) {
e.Error("k", err)
})
}
})
})
b.Run("Object", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.InfoWithFields("some message", func(e onelog.Entry) {
e.Object("k", o)
})
}
})
})
}
package logbench
import (
"errors"
"io/ioutil"
"testing"
"github.com/rs/zerolog"
)
type obj struct {
Pub string
Tag string `json:"tag"`
priv int
}
func (o obj) MarshalZerologObject(e *zerolog.Event) {
e.Str("Pub", o.Pub).
Str("Tag", o.Tag).
Int("priv", o.priv)
}
func BenchmarkZerologFields(b *testing.B) {
logger := zerolog.New(ioutil.Discard)
benchmarkZerologFields(b, logger)
}
func BenchmarkZerologFieldsDisabled(b *testing.B) {
logger := zerolog.New(ioutil.Discard).Level(zerolog.Disabled)
benchmarkZerologFields(b, logger)
}
func benchmarkZerologFields(b *testing.B, logger zerolog.Logger) {
err := errors.New("some error")
o := obj{"a", "a", 0}
b.ResetTimer()
b.Run("Bool", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.Info().Bool("k", true).Msg("some message")
}
})
})
b.Run("Int", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.Info().Int("k", 123).Msg("some message")
}
})
})
b.Run("Float", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.Info().Float32("k", 1.23).Msg("some message")
}
})
})
b.Run("String", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.Info().Str("k", "foo").Msg("some message")
}
})
})
b.Run("Error", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.Info().AnErr("k", err).Msg("some message")
}
})
})
b.Run("Object", func(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
logger.Info().Object("k", o).Msg("some message")
}
})
})
}
@rs
Copy link
Author

rs commented May 8, 2018

Fist iteration results:

goarch: amd64
pkg: github.com/rs/zerolog/benchmarks
BenchmarkOnelogFields/Bool-8       	10000000	       229 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFields/Int-8        	10000000	       240 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFields/Float-8      	 5000000	       270 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFields/String-8     	 5000000	       239 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFields/Error-8      	 5000000	       256 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFields/Object-8     	 5000000	       302 ns/op	      48 B/op	       1 allocs/op
BenchmarkOnelogFieldsDisabled/Bool-8         	2000000000	         0.68 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFieldsDisabled/Int-8          	2000000000	         0.68 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFieldsDisabled/Float-8        	2000000000	         0.68 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFieldsDisabled/String-8       	2000000000	         0.69 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFieldsDisabled/Error-8        	2000000000	         0.94 ns/op	       0 B/op	       0 allocs/op
BenchmarkOnelogFieldsDisabled/Object-8       	2000000000	         1.42 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFields/Bool-8                	30000000	        41.1 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFields/Int-8                 	30000000	        46.2 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFields/Float-8               	20000000	        74.5 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFields/String-8              	30000000	        42.0 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFields/Error-8               	30000000	        46.2 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFields/Object-8              	20000000	        99.2 ns/op	      48 B/op	       1 allocs/op
BenchmarkZerologFieldsDisabled/Bool-8        	1000000000	         2.94 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFieldsDisabled/Int-8         	500000000	         2.93 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFieldsDisabled/Float-8       	500000000	         2.95 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFieldsDisabled/String-8      	500000000	         2.96 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFieldsDisabled/Error-8       	500000000	         3.09 ns/op	       0 B/op	       0 allocs/op
BenchmarkZerologFieldsDisabled/Object-8      	100000000	        21.1 ns/op	      48 B/op	       1 allocs/op
PASS
ok  	github.com/rs/zerolog/benchmarks	44.028s```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment