Home | History | Annotate | Download | only in garbage
      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 }
     53