Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / internal / event / bench_test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/event/bench_test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/event/bench_test.go
new file mode 100644 (file)
index 0000000..138b236
--- /dev/null
@@ -0,0 +1,154 @@
+package event_test
+
+import (
+       "context"
+       "io/ioutil"
+       "log"
+       "testing"
+
+       "golang.org/x/tools/internal/event"
+       "golang.org/x/tools/internal/event/core"
+       "golang.org/x/tools/internal/event/export"
+       "golang.org/x/tools/internal/event/keys"
+       "golang.org/x/tools/internal/event/label"
+)
+
+type Hooks struct {
+       A func(ctx context.Context, a int) (context.Context, func())
+       B func(ctx context.Context, b string) (context.Context, func())
+}
+
+var (
+       aValue  = keys.NewInt("a", "")
+       bValue  = keys.NewString("b", "")
+       aCount  = keys.NewInt64("aCount", "Count of time A is called.")
+       aStat   = keys.NewInt("aValue", "A value.")
+       bCount  = keys.NewInt64("B", "Count of time B is called.")
+       bLength = keys.NewInt("BLen", "B length.")
+
+       Baseline = Hooks{
+               A: func(ctx context.Context, a int) (context.Context, func()) {
+                       return ctx, func() {}
+               },
+               B: func(ctx context.Context, b string) (context.Context, func()) {
+                       return ctx, func() {}
+               },
+       }
+
+       StdLog = Hooks{
+               A: func(ctx context.Context, a int) (context.Context, func()) {
+                       log.Printf("A where a=%d", a)
+                       return ctx, func() {}
+               },
+               B: func(ctx context.Context, b string) (context.Context, func()) {
+                       log.Printf("B where b=%q", b)
+                       return ctx, func() {}
+               },
+       }
+
+       Log = Hooks{
+               A: func(ctx context.Context, a int) (context.Context, func()) {
+                       core.Log1(ctx, "A", aValue.Of(a))
+                       return ctx, func() {}
+               },
+               B: func(ctx context.Context, b string) (context.Context, func()) {
+                       core.Log1(ctx, "B", bValue.Of(b))
+                       return ctx, func() {}
+               },
+       }
+
+       Trace = Hooks{
+               A: func(ctx context.Context, a int) (context.Context, func()) {
+                       return core.Start1(ctx, "A", aValue.Of(a))
+               },
+               B: func(ctx context.Context, b string) (context.Context, func()) {
+                       return core.Start1(ctx, "B", bValue.Of(b))
+               },
+       }
+
+       Stats = Hooks{
+               A: func(ctx context.Context, a int) (context.Context, func()) {
+                       core.Metric1(ctx, aStat.Of(a))
+                       core.Metric1(ctx, aCount.Of(1))
+                       return ctx, func() {}
+               },
+               B: func(ctx context.Context, b string) (context.Context, func()) {
+                       core.Metric1(ctx, bLength.Of(len(b)))
+                       core.Metric1(ctx, bCount.Of(1))
+                       return ctx, func() {}
+               },
+       }
+
+       initialList = []int{0, 1, 22, 333, 4444, 55555, 666666, 7777777}
+       stringList  = []string{
+               "A value",
+               "Some other value",
+               "A nice longer value but not too long",
+               "V",
+               "",
+               "ı",
+               "prime count of values",
+       }
+)
+
+type namedBenchmark struct {
+       name string
+       test func(*testing.B)
+}
+
+func Benchmark(b *testing.B) {
+       b.Run("Baseline", Baseline.runBenchmark)
+       b.Run("StdLog", StdLog.runBenchmark)
+       benchmarks := []namedBenchmark{
+               {"Log", Log.runBenchmark},
+               {"Trace", Trace.runBenchmark},
+               {"Stats", Stats.runBenchmark},
+       }
+
+       event.SetExporter(nil)
+       for _, t := range benchmarks {
+               b.Run(t.name+"NoExporter", t.test)
+       }
+
+       event.SetExporter(noopExporter)
+       for _, t := range benchmarks {
+               b.Run(t.name+"Noop", t.test)
+       }
+
+       event.SetExporter(export.Spans(export.LogWriter(ioutil.Discard, false)))
+       for _, t := range benchmarks {
+               b.Run(t.name, t.test)
+       }
+}
+
+func A(ctx context.Context, hooks Hooks, a int) int {
+       ctx, done := hooks.A(ctx, a)
+       defer done()
+       return B(ctx, hooks, a, stringList[a%len(stringList)])
+}
+
+func B(ctx context.Context, hooks Hooks, a int, b string) int {
+       _, done := hooks.B(ctx, b)
+       defer done()
+       return a + len(b)
+}
+
+func (hooks Hooks) runBenchmark(b *testing.B) {
+       ctx := context.Background()
+       b.ReportAllocs()
+       b.ResetTimer()
+       var acc int
+       for i := 0; i < b.N; i++ {
+               for _, value := range initialList {
+                       acc += A(ctx, hooks, value)
+               }
+       }
+}
+
+func init() {
+       log.SetOutput(ioutil.Discard)
+}
+
+func noopExporter(ctx context.Context, ev core.Event, lm label.Map) context.Context {
+       return ctx
+}