|
|
@@ -0,0 +1,59 @@
|
|
|
+package timeutil
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type ProfileDataSeries struct {
|
|
|
+ Name string
|
|
|
+ Series []*ProfileDatum
|
|
|
+}
|
|
|
+
|
|
|
+func NewProfileDataSeries(name string, steps int) *ProfileDataSeries {
|
|
|
+ return &ProfileDataSeries{
|
|
|
+ Name: name,
|
|
|
+ Series: make([]*ProfileDatum, 0, steps+2),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (pds *ProfileDataSeries) Start() {
|
|
|
+ pds.Series = append(pds.Series, &ProfileDatum{
|
|
|
+ Name: "start",
|
|
|
+ Time: time.Now().UTC(),
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func (pds *ProfileDataSeries) Step(name string) {
|
|
|
+ pds.Series = append(pds.Series, &ProfileDatum{
|
|
|
+ Name: name,
|
|
|
+ Time: time.Now().UTC(),
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func (pds *ProfileDataSeries) Stop() {
|
|
|
+ pds.Series = append(pds.Series, &ProfileDatum{
|
|
|
+ Name: "stop",
|
|
|
+ Time: time.Now().UTC(),
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func (pds *ProfileDataSeries) String() string {
|
|
|
+ if pds == nil || len(pds.Series) < 2 {
|
|
|
+ return "--"
|
|
|
+ }
|
|
|
+
|
|
|
+ var sb strings.Builder
|
|
|
+ sb.WriteString(fmt.Sprintf("%s %v", pds.Name, pds.Series[len(pds.Series)-1].Time.Sub(pds.Series[0].Time)))
|
|
|
+ for i := 1; i < len(pds.Series); i++ {
|
|
|
+ pd := pds.Series[i]
|
|
|
+ sb.WriteString(fmt.Sprintf(" [%s %v]", pd.Name, pds.Series[i].Time.Sub(pds.Series[i-1].Time)))
|
|
|
+ }
|
|
|
+ return sb.String()
|
|
|
+}
|
|
|
+
|
|
|
+type ProfileDatum struct {
|
|
|
+ Name string
|
|
|
+ Time time.Time
|
|
|
+}
|