2021-11-08 16:39:17 +00:00

172 lines
3.9 KiB
Go

/*
Copyright 2021 The logr Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package logr
import (
"fmt"
"testing"
"github.com/go-logr/logr"
"github.com/go-logr/logr/funcr"
)
func noop(prefix, args string) {
}
//go:noinline
func doInfoOneArg(b *testing.B, log logr.Logger) {
for i := 0; i < b.N; i++ {
log.Info("this is", "a", "string")
}
}
//go:noinline
func doInfoSeveralArgs(b *testing.B, log logr.Logger) {
for i := 0; i < b.N; i++ {
log.Info("multi",
"bool", true, "string", "str", "int", 42,
"float", 3.14, "struct", struct{ X, Y int }{93, 76})
}
}
//go:noinline
func doV0Info(b *testing.B, log logr.Logger) {
for i := 0; i < b.N; i++ {
log.V(0).Info("multi",
"bool", true, "string", "str", "int", 42,
"float", 3.14, "struct", struct{ X, Y int }{93, 76})
}
}
//go:noinline
func doV9Info(b *testing.B, log logr.Logger) {
for i := 0; i < b.N; i++ {
log.V(9).Info("multi",
"bool", true, "string", "str", "int", 42,
"float", 3.14, "struct", struct{ X, Y int }{93, 76})
}
}
//go:noinline
func doError(b *testing.B, log logr.Logger) {
err := fmt.Errorf("error message")
for i := 0; i < b.N; i++ {
log.Error(err, "multi",
"bool", true, "string", "str", "int", 42,
"float", 3.14, "struct", struct{ X, Y int }{93, 76})
}
}
//go:noinline
func doWithValues(b *testing.B, log logr.Logger) {
for i := 0; i < b.N; i++ {
l := log.WithValues("k1", "v1", "k2", "v2")
_ = l
}
}
//go:noinline
func doWithName(b *testing.B, log logr.Logger) {
for i := 0; i < b.N; i++ {
l := log.WithName("name")
_ = l
}
}
//go:noinline
func doWithCallDepth(b *testing.B, log logr.Logger) {
for i := 0; i < b.N; i++ {
l := log.WithCallDepth(1)
_ = l
}
}
func BenchmarkDiscardInfoOneArg(b *testing.B) {
var log logr.Logger = logr.Discard()
doInfoOneArg(b, log)
}
func BenchmarkDiscardInfoSeveralArgs(b *testing.B) {
var log logr.Logger = logr.Discard()
doInfoSeveralArgs(b, log)
}
func BenchmarkDiscardV0Info(b *testing.B) {
var log logr.Logger = logr.Discard()
doV0Info(b, log)
}
func BenchmarkDiscardV9Info(b *testing.B) {
var log logr.Logger = logr.Discard()
doV9Info(b, log)
}
func BenchmarkDiscardError(b *testing.B) {
var log logr.Logger = logr.Discard()
doError(b, log)
}
func BenchmarkDiscardWithValues(b *testing.B) {
var log logr.Logger = logr.Discard()
doWithValues(b, log)
}
func BenchmarkDiscardWithName(b *testing.B) {
var log logr.Logger = logr.Discard()
doWithName(b, log)
}
func BenchmarkFuncrInfoOneArg(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doInfoOneArg(b, log)
}
func BenchmarkFuncrInfoSeveralArgs(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doInfoSeveralArgs(b, log)
}
func BenchmarkFuncrV0Info(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doV0Info(b, log)
}
func BenchmarkFuncrV9Info(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doV9Info(b, log)
}
func BenchmarkFuncrError(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doError(b, log)
}
func BenchmarkFuncrWithValues(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doWithValues(b, log)
}
func BenchmarkFuncrWithName(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doWithName(b, log)
}
func BenchmarkFuncrWithCallDepth(b *testing.B) {
var log logr.Logger = funcr.New(noop, funcr.Options{})
doWithCallDepth(b, log)
}