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  }