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  }