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 }