github.com/aseara/baigo@v0.0.0-20220906090433-71f4fda0b6e0/lesson33/demo3/main_test.go (about) 1 package main 2 3 import ( 4 "sync" 5 "testing" 6 ) 7 8 type counter1 struct { 9 mu sync.Mutex 10 i int 11 } 12 13 var _cter counter1 14 15 func increase1() int { 16 _cter.mu.Lock() 17 defer _cter.mu.Unlock() 18 _cter.i++ 19 return _cter.i 20 } 21 22 func BenchmarkIncrease1(b *testing.B) { 23 var ( 24 wg sync.WaitGroup 25 num = 1000_000 26 ) 27 28 wg.Add(num) 29 for i := 0; i < num; i++ { 30 go func(i int) { 31 _ = increase1() 32 wg.Done() 33 }(i) 34 } 35 wg.Wait() 36 } 37 38 type counter2 struct { 39 c chan int 40 i int 41 } 42 43 func newCounter2() *counter2 { 44 cter := &counter2{ 45 c: make(chan int), 46 } 47 go func() { 48 for { 49 cter.i++ 50 cter.c <- cter.i 51 } 52 }() 53 return cter 54 } 55 56 func (cter *counter2) increase2() int { 57 return <-cter.c 58 } 59 60 func BenchmarkIncrease2(b *testing.B) { 61 var ( 62 wg sync.WaitGroup 63 cter = newCounter2() 64 num = 1000_000 65 ) 66 67 wg.Add(num) 68 for i := 0; i < num; i++ { 69 go func(i int) { 70 _ = cter.increase2() 71 wg.Done() 72 }(i) 73 } 74 wg.Wait() 75 }