github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/prof/profiler.go (about)

     1  package prof
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  	"fmt"
     7  	"sort"
     8  )
     9  
    10  var (
    11  	ioprof sync.Once
    12  	chpStart map[string]int64
    13  	chpTotal map[string]int64
    14  	start int64
    15  
    16  	ProfilerDisabled bool = true
    17  )
    18  
    19  type oneval struct {
    20  	name string
    21  	tim int64
    22  }
    23  type sortif struct {
    24  	val []oneval
    25  }
    26  
    27  func (i sortif) Len() int {
    28  	return len(i.val)
    29  }
    30  
    31  func (x sortif) Less(i, j int) bool {
    32  	return x.val[i].tim > x.val[j].tim
    33  }
    34  
    35  func (x sortif) Swap(i, j int) {
    36  	x.val[i], x.val[j] = x.val[j], x.val[i]
    37  }
    38  
    39  
    40  func Sta(name string) {
    41  	if ProfilerDisabled {
    42  		return
    43  	}
    44  	_, ok := chpStart[name]
    45  	if ok {
    46  		panic(name+" already started")
    47  	}
    48  	chpStart[name] = time.Now().UnixNano()
    49  }
    50  
    51  func Sto(name string) {
    52  	if ProfilerDisabled {
    53  		return
    54  	}
    55  	tim, ok := chpStart[name]
    56  	if !ok {
    57  		panic(name+" not started")
    58  	}
    59  	delete(chpStart, name)
    60  	del := time.Now().UnixNano()-tim
    61  	tim, ok = chpTotal[name]
    62  	if ok {
    63  		chpTotal[name]  = tim+del
    64  	} else {
    65  		chpTotal[name]  = del
    66  	}
    67  }
    68  
    69  func Stop() {
    70  	ProfilerDisabled = true
    71  	stop := time.Now().UnixNano() - start
    72  
    73  	if stop == 0 {
    74  		fmt.Println(len(chpTotal), "checkpoints but in zero time")
    75  		return
    76  	}
    77  
    78  	var mk sortif
    79  	mk.val = make([]oneval, len(chpTotal))
    80  	i := 0
    81  	for k, v := range chpTotal {
    82  	    mk.val[i].name = k
    83  	    mk.val[i].tim = v
    84  	    i++
    85  	}
    86  	sort.Sort(mk)
    87  
    88  	for i := range mk.val {
    89  		fmt.Printf("%40s : %8.3fs = %3d%%\n", mk.val[i].name,
    90  			float64(mk.val[i].tim)/1e9, 100*mk.val[i].tim/stop)
    91  	}
    92  }
    93  
    94  func Start() {
    95  	chpStart = make(map[string]int64)
    96  	chpTotal = make(map[string]int64)
    97  	start = time.Now().UnixNano()
    98  	ProfilerDisabled = false
    99  }