1package metrics 2 3import ( 4 "io/ioutil" 5 "log" 6 "sync" 7 "testing" 8) 9 10const FANOUT = 128 11 12// Stop the compiler from complaining during debugging. 13var ( 14 _ = ioutil.Discard 15 _ = log.LstdFlags 16) 17 18func 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} 108