func doSummary(s *gcstats.GcStats) { // Pause time: Max, 99th %ile, 95th %ile, mean // Mutator utilization // 50ms mutator utilization: Min, 1st %ile, 5th %ile pauseTimes := stats.Sample{Xs: []float64{}} for _, stop := range s.Stops() { pauseTimes.Xs = append(pauseTimes.Xs, float64(stop.Duration)) } pauseTimes.Sort() fmt.Print("Pause times: max=", ns(pauseTimes.Percentile(1)), " 99th %ile=", ns(pauseTimes.Percentile(.99)), " 95th %ile=", ns(pauseTimes.Percentile(.95)), " mean=", ns(pauseTimes.Mean()), "\n") if s.HaveProgTimes() { fmt.Print("Mutator utilization: ", pct(s.MutatorUtilization()), "\n") fmt.Print("50ms mutator utilization: min=", pct(s.MMUs([]int{50000000})[0]), "\n") } }
func stopKDEs(s *gcstats.GcStats) map[gcstats.PhaseKind]*stats.KDE { stops := s.Stops() times := make(map[gcstats.PhaseKind]stats.Sample) for _, stop := range stops { s := times[stop.Kind] s.Xs = append(s.Xs, float64(stop.Duration)/1e9) times[stop.Kind] = s } kdes := make(map[gcstats.PhaseKind]*stats.KDE) for kind, sample := range times { // XXX Bandwidth kdes[kind] = &stats.KDE{ Sample: sample, //Bandwidth: stats.FixedBandwidth(100000), BoundaryMethod: stats.BoundaryReflect, BoundaryMax: math.Inf(1), } } return kdes }