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