From e35e0e00b8bd5e41e24c22076402cede55bef1ac Mon Sep 17 00:00:00 2001 From: Anton Tiurin Date: Sat, 27 Jun 2015 17:09:22 +0300 Subject: [PATCH] [TextFormatter] Speed up. Fprintf is changed to buffer.Write* As Fprintf is slower than buffer.WriteString, it's replaced to faster call. Signed-off-by: Anton Tiurin --- formatter_bench_test.go | 10 ++++++++++ text_formatter.go | 25 ++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/formatter_bench_test.go b/formatter_bench_test.go index 77989da..c6d290c 100644 --- a/formatter_bench_test.go +++ b/formatter_bench_test.go @@ -1,6 +1,7 @@ package logrus import ( + "fmt" "testing" "time" ) @@ -45,6 +46,15 @@ var largeFields = Fields{ "entries": "yeah", } +var errorFields = Fields{ + "foo": fmt.Errorf("bar"), + "baz": fmt.Errorf("qux"), +} + +func BenchmarkErrorTextFormatter(b *testing.B) { + doBenchmark(b, &TextFormatter{DisableColors: true}, errorFields) +} + func BenchmarkSmallTextFormatter(b *testing.B) { doBenchmark(b, &TextFormatter{DisableColors: true}, smallFields) } diff --git a/text_formatter.go b/text_formatter.go index 4ed90e1..2e6fe1b 100644 --- a/text_formatter.go +++ b/text_formatter.go @@ -131,21 +131,28 @@ func needsQuoting(text string) bool { return true } -func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key, value interface{}) { - switch value.(type) { +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) { + + b.WriteString(key) + b.WriteByte('=') + + switch value := value.(type) { case string: - if needsQuoting(value.(string)) { - fmt.Fprintf(b, "%v=%s ", key, value) + if needsQuoting(value) { + b.WriteString(value) } else { - fmt.Fprintf(b, "%v=%q ", key, value) + fmt.Fprintf(b, "%q", value) } case error: - if needsQuoting(value.(error).Error()) { - fmt.Fprintf(b, "%v=%s ", key, value) + errmsg := value.Error() + if needsQuoting(errmsg) { + b.WriteString(errmsg) } else { - fmt.Fprintf(b, "%v=%q ", key, value) + fmt.Fprintf(b, "%q", value) } default: - fmt.Fprintf(b, "%v=%v ", key, value) + fmt.Fprint(b, value) } + + b.WriteByte(' ') }