github.com/whatap/golib@v0.0.22/util/panicutil/SelfInfoWin.go (about) 1 //+build windows 2 3 package panicutil 4 5 import ( 6 "fmt" 7 "syscall" 8 "time" 9 ) 10 11 var prevTime, prevUsage uint64 12 13 //GetSelfCPUUsage GetSelfCPUUsage 14 func GetSelfCPUUsage() (float32, error) { 15 handle, err := syscall.GetCurrentProcess() 16 if err != nil { 17 return 0, err 18 } 19 // fmt.Println("GetSelfCPUUsage ", prevTime, prevUsage) 20 var ctime, etime, ktime, utime syscall.Filetime 21 err = syscall.GetProcessTimes(handle, &ctime, &etime, &ktime, &utime) 22 if err != nil { 23 return 0, err 24 } 25 26 curTime := uint64(time.Now().UnixNano()) 27 curUsage := uint64(ktime.Nanoseconds()) + uint64(utime.Nanoseconds()) // Always overflows 28 29 var cpuUsagePercent float32 30 if prevTime > 0 && prevUsage > 0 { 31 timeDiff := curTime - prevTime 32 usageDiff := curUsage - prevUsage 33 cpuUsagePercent = float32(100 * float64(usageDiff) / float64(timeDiff)) 34 err = nil 35 } else { 36 err = fmt.Errorf("requires to run GetSelfCPUUsage twice at least") 37 } 38 39 prevTime = curTime 40 prevUsage = curUsage 41 42 return cpuUsagePercent, err 43 }