github.com/ccccaoqing/test@v0.0.0-20220510085219-3985d23445c0/test/bench/garbage/stats.go (about)

     1  // Copyright 2010 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"runtime"
    10  	"sort"
    11  	"time"
    12  )
    13  
    14  func gcstats(name string, n int, t time.Duration) {
    15  	st := new(runtime.MemStats)
    16  	runtime.ReadMemStats(st)
    17  	nprocs := runtime.GOMAXPROCS(-1)
    18  	cpus := ""
    19  	if nprocs != 1 {
    20  		cpus = fmt.Sprintf("-%d", nprocs)
    21  	}
    22  	fmt.Printf("garbage.%sMem%s Alloc=%d/%d Heap=%d NextGC=%d Mallocs=%d\n", name, cpus, st.Alloc, st.TotalAlloc, st.Sys, st.NextGC, st.Mallocs)
    23  	fmt.Printf("garbage.%s%s %d %d ns/op\n", name, cpus, n, t.Nanoseconds()/int64(n))
    24  	fmt.Printf("garbage.%sLastPause%s 1 %d ns/op\n", name, cpus, st.PauseNs[(st.NumGC-1)%uint32(len(st.PauseNs))])
    25  	fmt.Printf("garbage.%sPause%s %d %d ns/op\n", name, cpus, st.NumGC, int64(st.PauseTotalNs)/int64(st.NumGC))
    26  	nn := int(st.NumGC)
    27  	if nn >= len(st.PauseNs) {
    28  		nn = len(st.PauseNs)
    29  	}
    30  	t1, t2, t3, t4, t5 := tukey5(st.PauseNs[0:nn])
    31  	fmt.Printf("garbage.%sPause5%s: %d %d %d %d %d\n", name, cpus, t1, t2, t3, t4, t5)
    32  
    33  	//	fmt.Printf("garbage.%sScan: %v\n", name, st.ScanDist)
    34  }
    35  
    36  type T []uint64
    37  
    38  func (t T) Len() int           { return len(t) }
    39  func (t T) Swap(i, j int)      { t[i], t[j] = t[j], t[i] }
    40  func (t T) Less(i, j int) bool { return t[i] < t[j] }
    41  
    42  func tukey5(raw []uint64) (lo, q1, q2, q3, hi uint64) {
    43  	x := make(T, len(raw))
    44  	copy(x, raw)
    45  	sort.Sort(T(x))
    46  	lo = x[0]
    47  	q1 = x[len(x)/4]
    48  	q2 = x[len(x)/2]
    49  	q3 = x[len(x)*3/4]
    50  	hi = x[len(x)-1]
    51  	return
    52  }