package sharedcertprovider /* $ go test -bench=. . goos: darwin goarch: amd64 pkg: sharedcertprovider cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz BenchmarkChannelProvider-16 49003 25901 ns/op BenchmarkMutexProvider-16 106971 10535 ns/op BenchmarkRWMutexProvider-16 5733031 194.7 ns/op */ import ( "context" "testing" "time" ) func BenchmarkChannelProvider(b *testing.B) { bench(b, ChannelProvider) } func BenchmarkMutexProvider(b *testing.B) { bench(b, MutexProvider) } func BenchmarkRWMutexProvider(b *testing.B) { bench(b, RWMutexProvider) } func bench(b *testing.B, newProvider func(context.Context, time.Duration) Provider) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() provider := newProvider(ctx, time.Second/1000) for i := 0; i < 50; i++ { go contend(ctx, provider) } for i := 0; i < b.N; i++ { cert := provider.GetCert() if !cert.Valid() { b.Logf("bad cert! %v xxx %v", time.Now(), provider.GetCert().validUntil) b.FailNow() } } } func contend(ctx context.Context, provider Provider) { for ctx.Err() == nil { provider.GetCert() } }