github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/runtime_test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 package metrics 10 11 import ( 12 "runtime" 13 "testing" 14 "time" 15 ) 16 17 func BenchmarkRuntimeMemStats(b *testing.B) { 18 r := NewRegistry() 19 RegisterRuntimeMemStats(r) 20 b.ResetTimer() 21 for i := 0; i < b.N; i++ { 22 CaptureRuntimeMemStatsOnce(r) 23 } 24 } 25 26 func TestRuntimeMemStats(t *testing.T) { 27 r := NewRegistry() 28 RegisterRuntimeMemStats(r) 29 CaptureRuntimeMemStatsOnce(r) 30 zero := runtimeMetrics.MemStats.PauseNs.Count() //得到一个“零”,因为GC可能在这些测试之前运行。 31 runtime.GC() 32 CaptureRuntimeMemStatsOnce(r) 33 if count := runtimeMetrics.MemStats.PauseNs.Count(); 1 != count-zero { 34 t.Fatal(count - zero) 35 } 36 runtime.GC() 37 runtime.GC() 38 CaptureRuntimeMemStatsOnce(r) 39 if count := runtimeMetrics.MemStats.PauseNs.Count(); 3 != count-zero { 40 t.Fatal(count - zero) 41 } 42 for i := 0; i < 256; i++ { 43 runtime.GC() 44 } 45 CaptureRuntimeMemStatsOnce(r) 46 if count := runtimeMetrics.MemStats.PauseNs.Count(); 259 != count-zero { 47 t.Fatal(count - zero) 48 } 49 for i := 0; i < 257; i++ { 50 runtime.GC() 51 } 52 CaptureRuntimeMemStatsOnce(r) 53 if count := runtimeMetrics.MemStats.PauseNs.Count(); 515 != count-zero { //我们丢失了一个,因为捕获之间的GCS太多了。 54 t.Fatal(count - zero) 55 } 56 } 57 58 func TestRuntimeMemStatsNumThread(t *testing.T) { 59 r := NewRegistry() 60 RegisterRuntimeMemStats(r) 61 CaptureRuntimeMemStatsOnce(r) 62 63 if value := runtimeMetrics.NumThread.Value(); value < 1 { 64 t.Fatalf("got NumThread: %d, wanted at least 1", value) 65 } 66 } 67 68 func TestRuntimeMemStatsBlocking(t *testing.T) { 69 if g := runtime.GOMAXPROCS(0); g < 2 { 70 t.Skipf("skipping TestRuntimeMemStatsBlocking with GOMAXPROCS=%d\n", g) 71 } 72 ch := make(chan int) 73 go testRuntimeMemStatsBlocking(ch) 74 var memStats runtime.MemStats 75 t0 := time.Now() 76 runtime.ReadMemStats(&memStats) 77 t1 := time.Now() 78 t.Log("i++ during runtime.ReadMemStats:", <-ch) 79 go testRuntimeMemStatsBlocking(ch) 80 d := t1.Sub(t0) 81 t.Log(d) 82 time.Sleep(d) 83 t.Log("i++ during time.Sleep:", <-ch) 84 } 85 86 func testRuntimeMemStatsBlocking(ch chan int) { 87 i := 0 88 for { 89 select { 90 case ch <- i: 91 return 92 default: 93 i++ 94 } 95 } 96 }