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  }