49 lines
		
	
	
		
			849 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			849 B
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | package metrics | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"runtime" | ||
|  | 	"runtime/debug" | ||
|  | 	"testing" | ||
|  | 	"time" | ||
|  | ) | ||
|  | 
 | ||
|  | func BenchmarkDebugGCStats(b *testing.B) { | ||
|  | 	r := NewRegistry() | ||
|  | 	RegisterDebugGCStats(r) | ||
|  | 	b.ResetTimer() | ||
|  | 	for i := 0; i < b.N; i++ { | ||
|  | 		CaptureDebugGCStatsOnce(r) | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func TestDebugGCStatsBlocking(t *testing.T) { | ||
|  | 	if g := runtime.GOMAXPROCS(0); g < 2 { | ||
|  | 		t.Skipf("skipping TestDebugGCMemStatsBlocking with GOMAXPROCS=%d\n", g) | ||
|  | 		return | ||
|  | 	} | ||
|  | 	ch := make(chan int) | ||
|  | 	go testDebugGCStatsBlocking(ch) | ||
|  | 	var gcStats debug.GCStats | ||
|  | 	t0 := time.Now() | ||
|  | 	debug.ReadGCStats(&gcStats) | ||
|  | 	t1 := time.Now() | ||
|  | 	t.Log("i++ during debug.ReadGCStats:", <-ch) | ||
|  | 	go testDebugGCStatsBlocking(ch) | ||
|  | 	d := t1.Sub(t0) | ||
|  | 	t.Log(d) | ||
|  | 	time.Sleep(d) | ||
|  | 	t.Log("i++ during time.Sleep:", <-ch) | ||
|  | } | ||
|  | 
 | ||
|  | func testDebugGCStatsBlocking(ch chan int) { | ||
|  | 	i := 0 | ||
|  | 	for { | ||
|  | 		select { | ||
|  | 		case ch <- i: | ||
|  | 			return | ||
|  | 		default: | ||
|  | 			i++ | ||
|  | 		} | ||
|  | 	} | ||
|  | } |