github.com/benchkram/bob@v0.0.0-20240314204020-b7a57f2f9be9/pkg/timing/timing.go (about) 1 package timing 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func Track(start time.Time, name string) { 9 elapsed := time.Since(start) 10 fmt.Printf("%s took %s\n", name, elapsed) 11 } 12 13 type Measurement struct { 14 // name of the measurement 15 name string 16 17 // sum is the total duration elapsed yet 18 sum time.Duration 19 20 // lastStart last time Start() was called 21 lastStart time.Time 22 23 // cycles is the number of Start()/Stop() cycles 24 cycles uint 25 } 26 27 func NewMeasurement(name string) *Measurement { 28 return &Measurement{ 29 name: name, 30 } 31 } 32 33 func NewStartedMeasurement(name string) *Measurement { 34 m := NewMeasurement(name) 35 m.Start() 36 return m 37 } 38 39 func (m *Measurement) Start() { 40 m.lastStart = time.Now() 41 } 42 43 func (m *Measurement) Stop() { 44 elapsed := time.Since(m.lastStart) 45 46 m.sum = m.sum + elapsed 47 m.cycles++ 48 } 49 50 func (m *Measurement) String() string { 51 return fmt.Sprintf("%s ran %d times for a total of %s", m.name, m.cycles, m.sum) 52 }