瀏覽代碼

Fanout the metric updaters.

Richard Crowley 12 年之前
父節點
當前提交
2af5c1e327
共有 1 個文件被更改,包括 45 次插入21 次删除
  1. 45 21
      metrics_test.go

+ 45 - 21
metrics_test.go

@@ -2,30 +2,39 @@ package metrics
 
 import (
 	"io/ioutil"
+	"log"
+	"sync"
 	"testing"
 )
 
-var _ = ioutil.Discard // Stop the compiler from complaining during debugging.
+const FANOUT = 4
+
+// Stop the compiler from complaining during debugging.
+var (
+	_ = ioutil.Discard
+	_ = log.LstdFlags
+)
 
 func BenchmarkMetrics(b *testing.B) {
-	c := NewCounter()
-	g := NewGauge()
-	h := NewHistogram(NewUniformSample(100))
-	m := NewMeter()
-	t := NewTimer()
 	r := NewRegistry()
-	r.Register("counter", c)
-	r.Register("gauge", g)
-	r.Register("histogram", h)
-	r.Register("meter", m)
-	r.Register("timer", t)
+	c := NewRegisteredCounter("counter", r)
+	g := NewRegisteredGauge("gauge", r)
+	h := NewRegisteredHistogram("histogram", r, NewUniformSample(100))
+	m := NewRegisteredMeter("meter", r)
+	t := NewRegisteredTimer("timer", r)
 	RegisterRuntimeMemStats(r)
+	b.ResetTimer()
 	ch := make(chan bool)
-/*
+	wgC := &sync.WaitGroup{}
+//*
+	wgC.Add(1)
 	go func() {
+		defer wgC.Done()
+		//log.Println("go CaptureRuntimeMemStats")
 		for {
 			select {
 			case <-ch:
+				//log.Println("done CaptureRuntimeMemStats")
 				return
 			default:
 				CaptureRuntimeMemStatsOnce(r)
@@ -33,11 +42,16 @@ func BenchmarkMetrics(b *testing.B) {
 		}
 	}()
 //*/
-//*
+	wgW := &sync.WaitGroup{}
+/*
+	wgW.Add(1)
 	go func() {
+		defer wgW.Done()
+		//log.Println("go Write")
 		for {
 			select {
 			case <-ch:
+				//log.Println("done Write")
 				return
 			default:
 				WriteOnce(r, ioutil.Discard)
@@ -45,14 +59,24 @@ func BenchmarkMetrics(b *testing.B) {
 		}
 	}()
 //*/
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		c.Inc(1)
-		g.Update(int64(i))
-		h.Update(int64(i))
-		m.Mark(1)
-		t.Update(1)
+	wg := &sync.WaitGroup{}
+	wg.Add(FANOUT)
+	for i := 0; i < FANOUT; i++ {
+		go func(i int) {
+			defer wg.Done()
+			//log.Println("go", i)
+			for i := 0; i < b.N; i++ {
+				c.Inc(1)
+				g.Update(int64(i))
+				h.Update(int64(i))
+				m.Mark(1)
+				t.Update(1)
+			}
+			//log.Println("done", i)
+		}(i)
 	}
-	b.StopTimer()
+	wg.Wait()
 	close(ch)
+	wgC.Wait()
+	wgW.Wait()
 }