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