зеркало из https://github.com/golang/dep.git
85 строки
1.6 KiB
Go
85 строки
1.6 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package gps
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"log"
|
|
"sort"
|
|
"text/tabwriter"
|
|
"time"
|
|
)
|
|
|
|
type metrics struct {
|
|
stack []string
|
|
times map[string]time.Duration
|
|
last time.Time
|
|
}
|
|
|
|
func newMetrics() *metrics {
|
|
return &metrics{
|
|
stack: []string{"other"},
|
|
times: map[string]time.Duration{
|
|
"other": 0,
|
|
},
|
|
last: time.Now(),
|
|
}
|
|
}
|
|
|
|
func (m *metrics) push(name string) {
|
|
cn := m.stack[len(m.stack)-1]
|
|
m.times[cn] = m.times[cn] + time.Since(m.last)
|
|
|
|
m.stack = append(m.stack, name)
|
|
m.last = time.Now()
|
|
}
|
|
|
|
func (m *metrics) pop() {
|
|
on := m.stack[len(m.stack)-1]
|
|
m.times[on] = m.times[on] + time.Since(m.last)
|
|
|
|
m.stack = m.stack[:len(m.stack)-1]
|
|
m.last = time.Now()
|
|
}
|
|
|
|
func (m *metrics) dump(l *log.Logger) {
|
|
s := make(ndpairs, len(m.times))
|
|
k := 0
|
|
for n, d := range m.times {
|
|
s[k] = ndpair{
|
|
n: n,
|
|
d: d,
|
|
}
|
|
k++
|
|
}
|
|
|
|
sort.Sort(sort.Reverse(s))
|
|
|
|
var tot time.Duration
|
|
var buf bytes.Buffer
|
|
w := tabwriter.NewWriter(&buf, 0, 0, 1, ' ', tabwriter.AlignRight)
|
|
for _, nd := range s {
|
|
tot += nd.d
|
|
fmt.Fprintf(w, "\t%s:\t%v\t\n", nd.n, nd.d)
|
|
}
|
|
fmt.Fprintf(w, "\n\tTOTAL:\t%v\t\n", tot)
|
|
w.Flush()
|
|
|
|
l.Println("\nSolver wall times by segment:")
|
|
l.Println((&buf).String())
|
|
}
|
|
|
|
type ndpair struct {
|
|
n string
|
|
d time.Duration
|
|
}
|
|
|
|
type ndpairs []ndpair
|
|
|
|
func (s ndpairs) Less(i, j int) bool { return s[i].d < s[j].d }
|
|
func (s ndpairs) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
|
func (s ndpairs) Len() int { return len(s) }
|