github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/rcrowley/go-metrics/metrics_test.go (about)

     1  package metrics
     2  
     3  import (
     4  	"io/ioutil"
     5  	"log"
     6  	"sync"
     7  	"testing"
     8  )
     9  
    10  const FANOUT = 128
    11  
    12  // Stop the compiler from complaining during debugging.
    13  var (
    14  	_ = ioutil.Discard
    15  	_ = log.LstdFlags
    16  )
    17  
    18  func BenchmarkMetrics(b *testing.B) {
    19  	r := NewRegistry()
    20  	c := NewRegisteredCounter("counter", r)
    21  	g := NewRegisteredGauge("gauge", r)
    22  	gf := NewRegisteredGaugeFloat64("gaugefloat64", r)
    23  	h := NewRegisteredHistogram("histogram", r, NewUniformSample(100))
    24  	m := NewRegisteredMeter("meter", r)
    25  	t := NewRegisteredTimer("timer", r)
    26  	RegisterDebugGCStats(r)
    27  	RegisterRuntimeMemStats(r)
    28  	b.ResetTimer()
    29  	ch := make(chan bool)
    30  
    31  	wgD := &sync.WaitGroup{}
    32  	/*
    33  		wgD.Add(1)
    34  		go func() {
    35  			defer wgD.Done()
    36  			//log.Println("go CaptureDebugGCStats")
    37  			for {
    38  				select {
    39  				case <-ch:
    40  					//log.Println("done CaptureDebugGCStats")
    41  					return
    42  				default:
    43  					CaptureDebugGCStatsOnce(r)
    44  				}
    45  			}
    46  		}()
    47  	//*/
    48  
    49  	wgR := &sync.WaitGroup{}
    50  	//*
    51  	wgR.Add(1)
    52  	go func() {
    53  		defer wgR.Done()
    54  		//log.Println("go CaptureRuntimeMemStats")
    55  		for {
    56  			select {
    57  			case <-ch:
    58  				//log.Println("done CaptureRuntimeMemStats")
    59  				return
    60  			default:
    61  				CaptureRuntimeMemStatsOnce(r)
    62  			}
    63  		}
    64  	}()
    65  	//*/
    66  
    67  	wgW := &sync.WaitGroup{}
    68  	/*
    69  		wgW.Add(1)
    70  		go func() {
    71  			defer wgW.Done()
    72  			//log.Println("go Write")
    73  			for {
    74  				select {
    75  				case <-ch:
    76  					//log.Println("done Write")
    77  					return
    78  				default:
    79  					WriteOnce(r, ioutil.Discard)
    80  				}
    81  			}
    82  		}()
    83  	//*/
    84  
    85  	wg := &sync.WaitGroup{}
    86  	wg.Add(FANOUT)
    87  	for i := 0; i < FANOUT; i++ {
    88  		go func(i int) {
    89  			defer wg.Done()
    90  			//log.Println("go", i)
    91  			for i := 0; i < b.N; i++ {
    92  				c.Inc(1)
    93  				g.Update(int64(i))
    94  				gf.Update(float64(i))
    95  				h.Update(int64(i))
    96  				m.Mark(1)
    97  				t.Update(1)
    98  			}
    99  			//log.Println("done", i)
   100  		}(i)
   101  	}
   102  	wg.Wait()
   103  	close(ch)
   104  	wgD.Wait()
   105  	wgR.Wait()
   106  	wgW.Wait()
   107  }