63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package timer
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// Tracker 负责耗时打点追踪
|
|
type Tracker struct {
|
|
start time.Time
|
|
last time.Time
|
|
laps []Lap
|
|
}
|
|
|
|
type Lap struct {
|
|
Label string
|
|
Duration time.Duration
|
|
At time.Time
|
|
}
|
|
|
|
// Start 开始计时
|
|
func Start() *Tracker {
|
|
now := time.Now()
|
|
return &Tracker{start: now, last: now}
|
|
}
|
|
|
|
// Record 记录一段耗时 (Lap),并返回段耗时
|
|
func (t *Tracker) Record(label string) time.Duration {
|
|
now := time.Now()
|
|
d := now.Sub(t.last)
|
|
t.last = now
|
|
t.laps = append(t.laps, Lap{Label: label, Duration: d, At: now})
|
|
return d
|
|
}
|
|
|
|
// Stop 结束计时,返回总持续时间
|
|
func (t *Tracker) Stop() time.Duration {
|
|
return time.Since(t.start)
|
|
}
|
|
|
|
// Summarize 返回所有记录段
|
|
func (t *Tracker) Summarize() []Lap {
|
|
return t.laps
|
|
}
|
|
|
|
// Describe 返回格式化后的统计字符串
|
|
func (t *Tracker) Describe() string {
|
|
var sb strings.Builder
|
|
total := t.Stop()
|
|
for i, lap := range t.laps {
|
|
if i > 0 {
|
|
sb.WriteString("; ")
|
|
}
|
|
sb.WriteString(fmt.Sprintf("[%s] %v", lap.Label, lap.Duration))
|
|
}
|
|
if len(t.laps) > 0 {
|
|
sb.WriteString("; ")
|
|
}
|
|
sb.WriteString(fmt.Sprintf("Total: %v", total))
|
|
return sb.String()
|
|
}
|