-
Notifications
You must be signed in to change notification settings - Fork 0
/
stopwatch.go
122 lines (99 loc) · 2.61 KB
/
stopwatch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package time
import (
"fmt"
"log"
"strconv"
"strings"
"time"
)
// StopWatch is a multi-step timer for measuring execution time of functions, utils.
type StopWatch struct {
Total *StopWatchStep
timers []*StopWatchStep
timerKeys map[string]int
curStep *StopWatchStep
}
// NewStopWatch creates a new StopWatch
func NewStopWatch() *StopWatch {
return &StopWatch{
Total: NewStopWatchStep("Total"),
timers: []*StopWatchStep{},
timerKeys: map[string]int{},
}
}
// Step creates a new step inside stopWatchMgr
func (t *StopWatch) Step(name string) {
newTimer := NewStopWatchStep(name)
t.timerKeys[name] = len(t.timers)
t.timers = append(t.timers, newTimer)
t.curStep = newTimer
}
// FinishStep finishes the current step (if exists)
func (t *StopWatch) FinishStep() {
if t.curStep == nil {
log.Fatal("No current step to finish")
}
t.curStep.Finish()
}
// CurrentStep returns the current step
func (t *StopWatch) CurrentStep() *StopWatchStep {
return t.curStep
}
// Finish finishes the stop watch
func (t *StopWatch) Finish() {
t.Total.Finish()
}
// Print prints stats to stdout
func (t *StopWatch) Print() {
// func (t *StopWatchMgr) String() string {
maxNameLen := 0
maxDurLen := 0
for _, timer := range t.timers {
if len(timer.name) > maxNameLen {
maxNameLen = len(timer.name)
}
if len(timer.du.String()) > maxDurLen {
maxDurLen = len(timer.du.String())
}
}
maxNameLen = maxNameLen + 2
fmt.Printf("Total Operations: %d\n", len(t.timers))
// str += strings.Repeat("-", maxNameLen+maxDurLen+4))
for _, timer := range t.timers {
// padding := maxNameLen - len(timer.name)
fmt.Printf(" %-"+strconv.Itoa(maxNameLen)+"s: %s\n", timer.name, timer.du)
// fmt.Println(timer.String())
}
fmt.Println(strings.Repeat("-", maxNameLen+maxDurLen+4))
fmt.Println(fmt.Sprintf(" %-"+strconv.Itoa(maxNameLen)+"s: %s", t.Total.name, t.Total.du))
}
// StopWatchStep is a timer container
type StopWatchStep struct {
name string
tm time.Time
du time.Duration
}
// NewStopWatchStep returns a new stopWatch step
func NewStopWatchStep(name string) *StopWatchStep {
t := &StopWatchStep{
name: name,
}
t.Start()
return t
}
// Start starts the stop watch
func (t *StopWatchStep) Start() {
t.tm = time.Now()
}
// Finish ends the stop watch
func (t *StopWatchStep) Finish() {
t.du = time.Since(t.tm)
}
// String() returns a human readable result of the stop watch
func (t *StopWatchStep) String() string {
return fmt.Sprintf("%s: %s", t.name, t.du)
}
// Milliseconds returns the step time in Milliseconds
func (t *StopWatchStep) Milliseconds() float64 {
return float64(t.du / time.Millisecond)
}