timer/tracker.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()
}