Skip to content

Instantly share code, notes, and snippets.

@nownabe
Created October 30, 2023 00:52
Show Gist options
  • Save nownabe/2886dfdfc22b0eb04a7e39c7b639d71b to your computer and use it in GitHub Desktop.
Save nownabe/2886dfdfc22b0eb04a7e39c7b639d71b to your computer and use it in GitHub Desktop.
Which is faster
$ go test -bench .
goos: darwin
goarch: arm64
pkg: example.com/m
BenchmarkMiddleware-10 6388045 189.8 ns/op
BenchmarkList-10 5904484 205.4 ns/op
PASS
ok example.com/m 2.830s
package main
import (
"io"
"testing"
"github.com/rs/zerolog"
)
type hookFunc func(e *zerolog.Event)
type hook1 struct {
fn hookFunc
}
func (h *hook1) Run(e *zerolog.Event, level zerolog.Level, msg string) {
h.fn(e)
}
func (h *hook1) add(fn func(hookFunc) hookFunc) {
h.fn = fn(h.fn)
}
func newHook1() *hook1 {
h := &hook1{fn: func(e *zerolog.Event) { e.Str("foo0", "bar") }}
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo1", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo2", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo3", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo4", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo5", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo6", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo7", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo8", "bar")
fn(e)
}
})
h.add(func(fn hookFunc) hookFunc {
return func(e *zerolog.Event) {
e.Str("foo9", "bar")
fn(e)
}
})
return h
}
type hook2 struct {
fn []func(e *zerolog.Event)
}
func (h hook2) Run(e *zerolog.Event, level zerolog.Level, msg string) {
for _, fn := range h.fn {
fn(e)
}
}
func newHook2() *hook2 {
return &hook2{fn: []func(e *zerolog.Event){
func(e *zerolog.Event) { e.Str("foo0", "bar") },
func(e *zerolog.Event) { e.Str("foo1", "bar") },
func(e *zerolog.Event) { e.Str("foo2", "bar") },
func(e *zerolog.Event) { e.Str("foo3", "bar") },
func(e *zerolog.Event) { e.Str("foo4", "bar") },
func(e *zerolog.Event) { e.Str("foo5", "bar") },
func(e *zerolog.Event) { e.Str("foo6", "bar") },
func(e *zerolog.Event) { e.Str("foo7", "bar") },
func(e *zerolog.Event) { e.Str("foo8", "bar") },
func(e *zerolog.Event) { e.Str("foo9", "bar") },
}}
}
func useHook1(n int) {
logger := zerolog.New(io.Discard).Hook(newHook1())
for i := 0; i < n; i++ {
logger.Info().Msg("hello")
}
}
func useHook2(n int) {
logger := zerolog.New(io.Discard).Hook(newHook2())
for i := 0; i < n; i++ {
logger.Info().Msg("hello")
}
}
func BenchmarkMiddleware(b *testing.B) {
useHook1(b.N)
}
func BenchmarkList(b *testing.B) {
useHook2(b.N)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment