1
2
3
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
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 }
53
View as plain text