github.com/aavshr/aws-sdk-go@v1.41.3/aws/credentials/credentials_bench_test.go (about) 1 //go:build go1.9 2 // +build go1.9 3 4 package credentials 5 6 import ( 7 "fmt" 8 "strconv" 9 "sync" 10 "testing" 11 "time" 12 ) 13 14 func BenchmarkCredentials_Get(b *testing.B) { 15 stub := &stubProvider{} 16 17 cases := []int{1, 10, 100, 500, 1000, 10000} 18 19 for _, c := range cases { 20 b.Run(strconv.Itoa(c), func(b *testing.B) { 21 creds := NewCredentials(stub) 22 var wg sync.WaitGroup 23 wg.Add(c) 24 for i := 0; i < c; i++ { 25 go func() { 26 for j := 0; j < b.N; j++ { 27 v, err := creds.Get() 28 if err != nil { 29 b.Errorf("expect no error %v, %v", v, err) 30 } 31 } 32 wg.Done() 33 }() 34 } 35 b.ResetTimer() 36 37 wg.Wait() 38 }) 39 } 40 } 41 42 func BenchmarkCredentials_Get_Expire(b *testing.B) { 43 p := &blockProvider{} 44 45 expRates := []int{10000, 1000, 100} 46 cases := []int{1, 10, 100, 500, 1000, 10000} 47 48 for _, expRate := range expRates { 49 for _, c := range cases { 50 b.Run(fmt.Sprintf("%d-%d", expRate, c), func(b *testing.B) { 51 creds := NewCredentials(p) 52 var wg sync.WaitGroup 53 wg.Add(c) 54 for i := 0; i < c; i++ { 55 go func(id int) { 56 for j := 0; j < b.N; j++ { 57 v, err := creds.Get() 58 if err != nil { 59 b.Errorf("expect no error %v, %v", v, err) 60 } 61 // periodically expire creds to cause rwlock 62 if id == 0 && j%expRate == 0 { 63 creds.Expire() 64 } 65 } 66 wg.Done() 67 }(i) 68 } 69 b.ResetTimer() 70 71 wg.Wait() 72 }) 73 } 74 } 75 } 76 77 type blockProvider struct { 78 creds Value 79 expired bool 80 err error 81 } 82 83 func (s *blockProvider) Retrieve() (Value, error) { 84 s.expired = false 85 s.creds.ProviderName = "blockProvider" 86 time.Sleep(time.Millisecond) 87 return s.creds, s.err 88 } 89 func (s *blockProvider) IsExpired() bool { 90 return s.expired 91 }