diff --git a/.readme.tmpl b/.readme.tmpl index c6440db8e..3154a1e64 100644 --- a/.readme.tmpl +++ b/.readme.tmpl @@ -100,9 +100,10 @@ pinned in zap's [glide.lock][] file. [↩](#anchor-versions) [doc-img]: https://godoc.org/go.uber.org/zap?status.svg [doc]: https://godoc.org/go.uber.org/zap -[ci-img]: https://travis-ci.org/uber-go/zap.svg?branch=master -[ci]: https://travis-ci.org/uber-go/zap +[ci-img]: https://travis-ci.com/uber-go/zap.svg?branch=master +[ci]: https://travis-ci.com/uber-go/zap [cov-img]: https://codecov.io/gh/uber-go/zap/branch/master/graph/badge.svg [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks [glide.lock]: https://github.com/uber-go/zap/blob/master/glide.lock + diff --git a/Makefile b/Makefile index 073e9aa91..68f4dd3d6 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ dependencies: go install ./vendor/github.com/mattn/goveralls ifdef SHOULD_LINT @echo "Installing golint..." - go install ./vendor/github.com/golang/lint/golint + go install ./vendor/golang.org/x/lint/golint else @echo "Not installing golint, since we don't expect to lint on" $(GO_VERSION) endif diff --git a/README.md b/README.md index 304b964cb..0734dd931 100644 --- a/README.md +++ b/README.md @@ -64,43 +64,40 @@ id="anchor-versions">[1](#footnote-versions) Log a message and 10 fields: -| Package | Time | Objects Allocated | -| :--- | :---: | :---: | -| :zap: zap | 3131 ns/op | 5 allocs/op | -| :zap: zap (sugared) | 4173 ns/op | 21 allocs/op | -| zerolog | 16154 ns/op | 90 allocs/op | -| lion | 16341 ns/op | 111 allocs/op | -| go-kit | 17049 ns/op | 126 allocs/op | -| logrus | 23662 ns/op | 142 allocs/op | -| log15 | 36351 ns/op | 149 allocs/op | -| apex/log | 42530 ns/op | 126 allocs/op | +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 862 ns/op | +0% | 5 allocs/op +| :zap: zap (sugared) | 1250 ns/op | +45% | 11 allocs/op +| zerolog | 4021 ns/op | +366% | 76 allocs/op +| go-kit | 4542 ns/op | +427% | 105 allocs/op +| apex/log | 26785 ns/op | +3007% | 115 allocs/op +| logrus | 29501 ns/op | +3322% | 125 allocs/op +| log15 | 29906 ns/op | +3369% | 122 allocs/op Log a message with a logger that already has 10 fields of context: -| Package | Time | Objects Allocated | -| :--- | :---: | :---: | -| :zap: zap | 380 ns/op | 0 allocs/op | -| :zap: zap (sugared) | 564 ns/op | 2 allocs/op | -| zerolog | 321 ns/op | 0 allocs/op | -| lion | 7092 ns/op | 39 allocs/op | -| go-kit | 20226 ns/op | 115 allocs/op | -| logrus | 22312 ns/op | 130 allocs/op | -| log15 | 28788 ns/op | 79 allocs/op | -| apex/log | 42063 ns/op | 115 allocs/op | +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 126 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 187 ns/op | +48% | 2 allocs/op +| zerolog | 88 ns/op | -30% | 0 allocs/op +| go-kit | 5087 ns/op | +3937% | 103 allocs/op +| log15 | 18548 ns/op | +14621% | 73 allocs/op +| apex/log | 26012 ns/op | +20544% | 104 allocs/op +| logrus | 27236 ns/op | +21516% | 113 allocs/op Log a static string, without any context or `printf`-style templating: -| Package | Time | Objects Allocated | -| :--- | :---: | :---: | -| :zap: zap | 361 ns/op | 0 allocs/op | -| :zap: zap (sugared) | 534 ns/op | 2 allocs/op | -| zerolog | 323 ns/op | 0 allocs/op | -| standard library | 575 ns/op | 2 allocs/op | -| go-kit | 922 ns/op | 13 allocs/op | -| lion | 1413 ns/op | 10 allocs/op | -| logrus | 2291 ns/op | 27 allocs/op | -| apex/log | 3690 ns/op | 11 allocs/op | -| log15 | 5954 ns/op | 26 allocs/op | +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 118 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 191 ns/op | +62% | 2 allocs/op +| zerolog | 93 ns/op | -21% | 0 allocs/op +| go-kit | 280 ns/op | +137% | 11 allocs/op +| standard library | 499 ns/op | +323% | 2 allocs/op +| apex/log | 1990 ns/op | +1586% | 10 allocs/op +| logrus | 3129 ns/op | +2552% | 24 allocs/op +| log15 | 3887 ns/op | +3194% | 23 allocs/op ## Development Status: Stable @@ -134,3 +131,4 @@ pinned in zap's [glide.lock][] file. [↩](#anchor-versions) [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks [glide.lock]: https://github.com/uber-go/zap/blob/master/glide.lock + diff --git a/benchmarks/lion_test.go b/benchmarks/lion_test.go deleted file mode 100644 index 6c41cb110..000000000 --- a/benchmarks/lion_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2016 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package benchmarks - -import ( - "io/ioutil" - - "go.pedge.io/lion" -) - -func newLion() lion.Logger { - return lion.NewLogger(lion.NewJSONWritePusher(ioutil.Discard)) -} diff --git a/benchmarks/scenario_bench_test.go b/benchmarks/scenario_bench_test.go index 4e307d215..134045a05 100644 --- a/benchmarks/scenario_bench_test.go +++ b/benchmarks/scenario_bench_test.go @@ -315,15 +315,6 @@ func BenchmarkWithoutFields(b *testing.B) { } }) }) - b.Run("go.pedge.io/lion", func(b *testing.B) { - logger := newLion() - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - logger.Printf(getMessage(0)) - } - }) - }) b.Run("stdlib.Println", func(b *testing.B) { logger := log.New(ioutil.Discard, "", log.LstdFlags) b.ResetTimer() @@ -462,15 +453,6 @@ func BenchmarkAccumulatedContext(b *testing.B) { } }) }) - b.Run("go.pedge.io/lion", func(b *testing.B) { - logger := newLion().WithFields(fakeLogrusFields()) - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - logger.Infof(getMessage(0)) - } - }) - }) b.Run("rs/zerolog", func(b *testing.B) { logger := fakeZerologContext(newZerolog().With()).Logger() b.ResetTimer() @@ -582,15 +564,6 @@ func BenchmarkAddingFields(b *testing.B) { } }) }) - b.Run("go.pedge.io/lion", func(b *testing.B) { - logger := newLion() - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - logger.WithFields(fakeLogrusFields()).Infof(getMessage(0)) - } - }) - }) b.Run("rs/zerolog", func(b *testing.B) { logger := newZerolog() b.ResetTimer() diff --git a/glide.lock b/glide.lock index 881b462c0..fdab64ffd 100644 --- a/glide.lock +++ b/glide.lock @@ -1,13 +1,13 @@ -hash: f073ba522c06c88ea3075bde32a8aaf0969a840a66cab6318a0897d141ffee92 -updated: 2017-07-22T18:06:49.598185334-07:00 +hash: 1c2f95e0188217dc3daba650cd73421f3e9b03d6adb35d7cbab4937333a98233 +updated: 2019-06-05T19:46:16.367592-07:00 imports: - name: go.uber.org/atomic - version: 4e336646b2ef9fc6e47be8e21594178f98e5ebcf + version: df976f2515e274675050de7b3f42545de80594fd - name: go.uber.org/multierr version: 3c4937480c32f4c13a875a1829af76c98ca3d40a testImports: - name: github.com/apex/log - version: d9b960447bfa720077b2da653cc79e533455b499 + version: d6c5facec1f2ae23a97782ab0ee18af58734346f subpackages: - handlers/json - name: github.com/axw/gocov @@ -15,62 +15,60 @@ testImports: subpackages: - gocov - name: github.com/davecgh/go-spew - version: 04cdfd42973bb9c8589fd6a731800cf222fde1a9 + version: d8f796af33cc11cb798c1aaeb27a4ebc5099927d subpackages: - spew -- name: github.com/fatih/color - version: 62e9147c64a1ed519147b62a56a14e83e2be02c1 - name: github.com/go-kit/kit - version: e10f5bf035be9af21fd5b2fb4469d5716c6ab07d + version: e75cc1ab0282c013188f87a858f066ccd6cedbf1 subpackages: - log - name: github.com/go-logfmt/logfmt - version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 + version: 07c9b44f60d7ffdfb7d8efe1ad539965737836dc - name: github.com/go-stack/stack - version: 54be5f394ed2c3e19dac9134a40a95ba5a017f7b -- name: github.com/golang/lint - version: c5fb716d6688a859aae56d26d3e6070808df29f7 - subpackages: - - golint + version: 2fee6af1a9795aafbe0253a0cfbdf668e1fb8a9a +- name: github.com/konsorten/go-windows-terminal-sequences + version: f55edac94c9bbba5d6182a4be46d86a2c9b5b50e - name: github.com/kr/logfmt version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 - name: github.com/mattn/go-colorable - version: 3fa8c76f9daed4067e4a806fb7e4dc86455c6d6a + version: 8029fb3788e5a4a9c00e415f586a6d033f5d38b3 - name: github.com/mattn/go-isatty - version: fc9e8d8ef48496124e79ae0df75490096eccf6fe + version: 1311e847b0cb909da63b5fecfb5370aa66236465 - name: github.com/mattn/goveralls - version: 6efce81852ad1b7567c17ad71b03aeccc9dd9ae0 + version: 4d9899298d217719a8aea971675da567f0e3f96d - name: github.com/pborman/uuid - version: e790cca94e6cc75c7064b1332e63811d4aae1a53 + version: 8b1b92947f46224e3b97bb1a3a5b0382be00d31e - name: github.com/pkg/errors - version: 645ef00459ed84a119197bfb8d8205042c6df63d + version: 27936f6d90f9c8e1145f11ed52ffffbfdb9e0af7 - name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + version: 5d4384ee4fb2527b0a1256a821ebfc92f91efefc subpackages: - difflib - name: github.com/rs/zerolog - version: eed4c2b94d945e0b2456ad6aa518a443986b5f22 + version: 9938a23cba397691dbdc7a963304dbfedbe3a84c + subpackages: + - internal/cbor + - internal/json - name: github.com/satori/go.uuid - version: 5bf94b69c6b68ee1b541973bb8e1144db23a194b + version: b2ce2384e17bbe0c6d34077efa39dbab3e09123b - name: github.com/sirupsen/logrus - version: 7dd06bf38e1e13df288d471a57d5adbac106be9e + version: 2a22dbedbad1fd454910cd1f44f210ef90c28464 - name: github.com/stretchr/testify - version: f6abca593680b2315d2075e0f5e2a9751e3f431a + version: 34c6fa2dc70986bccbbffcc6130f6920a924b075 subpackages: - assert - require -- name: go.pedge.io/lion - version: 87958e8713f1fa138d993087133b97e976642159 +- name: golang.org/x/lint + version: 959b441ac422379a43da2230f62be024250818b0 + subpackages: + - golint - name: golang.org/x/sys - version: c4489faa6e5ab84c0ef40d6ee878f7a030281f0f + version: 4c4f7f33c9ed00de01c4c741d2177abfcfe19307 subpackages: - unix - name: golang.org/x/tools - version: 496819729719f9d07692195e0a94d6edd2251389 + version: 2c3de6a5aea1814ceabe3c0b72be5223f0d8f600 subpackages: - cover - name: gopkg.in/inconshreveable/log15.v2 - version: b105bd37f74e5d9dc7b6ad7806715c7a2b83fd3f - subpackages: - - stack - - term + version: 67afb5ed74ec82fd7ac8f49d27c509ac6f991970 diff --git a/glide.yaml b/glide.yaml index 94412594c..8e1d05e9a 100644 --- a/glide.yaml +++ b/glide.yaml @@ -22,12 +22,11 @@ testImport: - package: github.com/mattn/goveralls - package: github.com/pborman/uuid - package: github.com/pkg/errors -- package: go.pedge.io/lion - package: github.com/rs/zerolog - package: golang.org/x/tools subpackages: - cover -- package: github.com/golang/lint +- package: golang.org/x/lint subpackages: - golint - package: github.com/axw/gocov diff --git a/internal/readme/readme.go b/internal/readme/readme.go index 55414573e..9c1664cc0 100644 --- a/internal/readme/readme.go +++ b/internal/readme/readme.go @@ -43,7 +43,6 @@ var ( "go-kit/kit/log": "go-kit", "inconshreveable/log15": "log15", "apex/log": "apex/log", - "go.pedge.io/lion": "lion", "rs/zerolog": "zerolog", } ) @@ -96,9 +95,18 @@ func getBenchmarkRows(benchmarkName string) (string, error) { if err != nil { return "", err } + + // get the Zap time (unsugared) as baseline to compare with other loggers + baseline, err := getBenchmarkRow(benchmarkOutput, benchmarkName, "Zap", nil) + if err != nil { + return "", err + } + var benchmarkRows []*benchmarkRow for libraryName := range libraryNameToMarkdownName { - benchmarkRow, err := getBenchmarkRow(benchmarkOutput, benchmarkName, libraryName) + benchmarkRow, err := getBenchmarkRow( + benchmarkOutput, benchmarkName, libraryName, baseline, + ) if err != nil { return "", err } @@ -109,8 +117,8 @@ func getBenchmarkRows(benchmarkName string) (string, error) { } sort.Sort(benchmarkRowsByTime(benchmarkRows)) rows := []string{ - "| Package | Time | Objects Allocated |", - "| :--- | :---: | :---: |", + "| Package | Time | Time % to zap | Objects Allocated |", + "| :------ | :--: | :-----------: | :---------------: |", } for _, benchmarkRow := range benchmarkRows { rows = append(rows, benchmarkRow.String()) @@ -118,7 +126,9 @@ func getBenchmarkRows(benchmarkName string) (string, error) { return strings.Join(rows, "\n"), nil } -func getBenchmarkRow(input []string, benchmarkName string, libraryName string) (*benchmarkRow, error) { +func getBenchmarkRow( + input []string, benchmarkName string, libraryName string, baseline *benchmarkRow, +) (*benchmarkRow, error) { line, err := findUniqueSubstring(input, fmt.Sprintf("%s/%s-", benchmarkName, libraryName)) if err != nil { return nil, err @@ -142,12 +152,20 @@ func getBenchmarkRow(input []string, benchmarkName string, libraryName string) ( if err != nil { return nil, err } - return &benchmarkRow{ - libraryNameToMarkdownName[libraryName], - duration, - allocatedBytes, - allocatedObjects, - }, nil + r := &benchmarkRow{ + Name: libraryNameToMarkdownName[libraryName], + Time: duration, + AllocatedBytes: allocatedBytes, + AllocatedObjects: allocatedObjects, + } + + if baseline != nil { + r.ZapTime = baseline.Time + r.ZapAllocatedBytes = baseline.AllocatedBytes + r.ZapAllocatedObjects = baseline.AllocatedObjects + } + + return r, nil } func findUniqueSubstring(input []string, substring string) (string, error) { @@ -182,14 +200,31 @@ type tmplData struct { } type benchmarkRow struct { - Name string + Name string + Time time.Duration AllocatedBytes int AllocatedObjects int + + ZapTime time.Duration + ZapAllocatedBytes int + ZapAllocatedObjects int } func (b *benchmarkRow) String() string { - return fmt.Sprintf("| %s | %d ns/op | %d allocs/op |", b.Name, b.Time.Nanoseconds(), b.AllocatedObjects) + pct := func(val, baseline int64) string { + return fmt.Sprintf( + "%+0.f%%", + ((float64(val)/float64(baseline))*100)-100, + ) + } + t := b.Time.Nanoseconds() + tp := pct(t, b.ZapTime.Nanoseconds()) + + return fmt.Sprintf( + "| %s | %d ns/op | %s | %d allocs/op", b.Name, + t, tp, b.AllocatedObjects, + ) } type benchmarkRowsByTime []*benchmarkRow