github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/iavl/trace/trace.go (about) 1 package trace 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func NewTracer() *Tracer { 9 t := &Tracer{ 10 startTime: time.Now().UnixNano(), 11 } 12 return t 13 } 14 15 type Tracer struct { 16 startTime int64 17 lastPin string 18 lastPinStartTime int64 19 pins []string 20 intervals []int64 21 } 22 23 func (t *Tracer) Pin(format string, args ...interface{}) { 24 t.pinByFormat(fmt.Sprintf(format, args...)) 25 } 26 27 func (t *Tracer) pinByFormat(tag string) { 28 if len(tag) == 0 { 29 //panic("invalid tag") 30 return 31 } 32 33 if len(t.pins) > 100 { 34 // 100 pins limitation 35 return 36 } 37 38 now := time.Now().UnixNano() 39 40 if len(t.lastPin) > 0 { 41 t.pins = append(t.pins, t.lastPin) 42 t.intervals = append(t.intervals, (now-t.lastPinStartTime)/1e6) 43 } 44 t.lastPinStartTime = now 45 t.lastPin = tag 46 } 47 48 func (t *Tracer) Format() string { 49 if len(t.pins) == 0 { 50 return "" 51 } 52 53 t.Pin("_") 54 55 now := time.Now().UnixNano() 56 info := fmt.Sprintf("%s<%dms>", 57 "Elapsed", 58 (now-t.startTime)/1e6, 59 ) 60 for i := range t.pins { 61 info += fmt.Sprintf(", %s<%dms>", t.pins[i], t.intervals[i]) 62 } 63 return info 64 } 65 66 func (t *Tracer) String() string { 67 return t.Format() 68 } 69 70 func (t *Tracer) Reset() { 71 t.startTime = time.Now().UnixNano() 72 t.lastPin = "" 73 t.lastPinStartTime = 0 74 t.pins = nil 75 t.intervals = nil 76 }