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  }