1// +build go1.3
2
3package log15
4
5import (
6	"bytes"
7	"errors"
8	"io/ioutil"
9	"testing"
10	"time"
11)
12
13func BenchmarkStreamNoCtx(b *testing.B) {
14	lg := New()
15
16	buf := bytes.Buffer{}
17	lg.SetHandler(StreamHandler(&buf, LogfmtFormat()))
18
19	for i := 0; i < b.N; i++ {
20		lg.Info("test message")
21		buf.Reset()
22	}
23}
24
25func BenchmarkDiscard(b *testing.B) {
26	lg := New()
27	lg.SetHandler(DiscardHandler())
28
29	for i := 0; i < b.N; i++ {
30		lg.Info("test message")
31	}
32}
33
34func BenchmarkCallerFileHandler(b *testing.B) {
35	lg := New()
36	lg.SetHandler(CallerFileHandler(DiscardHandler()))
37
38	for i := 0; i < b.N; i++ {
39		lg.Info("test message")
40	}
41}
42
43func BenchmarkCallerFuncHandler(b *testing.B) {
44	lg := New()
45	lg.SetHandler(CallerFuncHandler(DiscardHandler()))
46
47	for i := 0; i < b.N; i++ {
48		lg.Info("test message")
49	}
50}
51
52func BenchmarkLogfmtNoCtx(b *testing.B) {
53	r := Record{
54		Time: time.Now(),
55		Lvl:  LvlInfo,
56		Msg:  "test message",
57		Ctx:  []interface{}{},
58	}
59
60	logfmt := LogfmtFormat()
61	for i := 0; i < b.N; i++ {
62		logfmt.Format(&r)
63	}
64}
65
66func BenchmarkJsonNoCtx(b *testing.B) {
67	r := Record{
68		Time: time.Now(),
69		Lvl:  LvlInfo,
70		Msg:  "test message",
71		Ctx:  []interface{}{},
72	}
73
74	jsonfmt := JsonFormat()
75	for i := 0; i < b.N; i++ {
76		jsonfmt.Format(&r)
77	}
78}
79
80func BenchmarkMultiLevelFilter(b *testing.B) {
81	handler := MultiHandler(
82		LvlFilterHandler(LvlDebug, DiscardHandler()),
83		LvlFilterHandler(LvlError, DiscardHandler()),
84	)
85
86	lg := New()
87	lg.SetHandler(handler)
88	for i := 0; i < b.N; i++ {
89		lg.Info("test message")
90	}
91}
92
93func BenchmarkDescendant1(b *testing.B) {
94	lg := New()
95	lg.SetHandler(DiscardHandler())
96	lg = lg.New()
97	for i := 0; i < b.N; i++ {
98		lg.Info("test message")
99	}
100}
101
102func BenchmarkDescendant2(b *testing.B) {
103	lg := New()
104	lg.SetHandler(DiscardHandler())
105	for i := 0; i < 2; i++ {
106		lg = lg.New()
107	}
108	for i := 0; i < b.N; i++ {
109		lg.Info("test message")
110	}
111}
112
113func BenchmarkDescendant4(b *testing.B) {
114	lg := New()
115	lg.SetHandler(DiscardHandler())
116	for i := 0; i < 4; i++ {
117		lg = lg.New()
118	}
119	for i := 0; i < b.N; i++ {
120		lg.Info("test message")
121	}
122}
123
124func BenchmarkDescendant8(b *testing.B) {
125	lg := New()
126	lg.SetHandler(DiscardHandler())
127	for i := 0; i < 8; i++ {
128		lg = lg.New()
129	}
130	for i := 0; i < b.N; i++ {
131		lg.Info("test message")
132	}
133}
134
135// Copied from https://github.com/uber-go/zap/blob/master/benchmarks/log15_bench_test.go
136// (MIT License)
137func newLog15() Logger {
138	logger := New()
139	logger.SetHandler(StreamHandler(ioutil.Discard, JsonFormat()))
140	return logger
141}
142
143var errExample = errors.New("fail")
144
145type user struct {
146	Name      string    `json:"name"`
147	Email     string    `json:"email"`
148	CreatedAt time.Time `json:"created_at"`
149}
150
151var _jane = user{
152	Name:      "Jane Doe",
153	Email:     "jane@test.com",
154	CreatedAt: time.Date(1980, 1, 1, 12, 0, 0, 0, time.UTC),
155}
156
157func BenchmarkLog15AddingFields(b *testing.B) {
158	logger := newLog15()
159	b.ResetTimer()
160	b.RunParallel(func(pb *testing.PB) {
161		for pb.Next() {
162			logger.Info("Go fast.",
163				"int", 1,
164				"int64", int64(1),
165				"float", 3.0,
166				"string", "four!",
167				"bool", true,
168				"time", time.Unix(0, 0),
169				"error", errExample.Error(),
170				"duration", time.Second,
171				"user-defined type", _jane,
172				"another string", "done!",
173			)
174		}
175	})
176}
177
178func BenchmarkLog15WithAccumulatedContext(b *testing.B) {
179	logger := newLog15().New(
180		"int", 1,
181		"int64", int64(1),
182		"float", 3.0,
183		"string", "four!",
184		"bool", true,
185		"time", time.Unix(0, 0),
186		"error", errExample.Error(),
187		"duration", time.Second,
188		"user-defined type", _jane,
189		"another string", "done!",
190	)
191	b.ResetTimer()
192	b.RunParallel(func(pb *testing.PB) {
193		for pb.Next() {
194			logger.Info("Go really fast.")
195		}
196	})
197}
198
199func BenchmarkLog15WithoutFields(b *testing.B) {
200	logger := newLog15()
201	b.ResetTimer()
202	b.RunParallel(func(pb *testing.PB) {
203		for pb.Next() {
204			logger.Info("Go fast.")
205		}
206	})
207}
208