123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- package utils
- import (
- "sort"
- "sync"
- "time"
- )
- var l = sync.Mutex{}
- // The "start" timestamp of a timing event.
- var _pointsInTime = make(map[string]time.Time)
- // A collection of timestamp durations for returning the average of.
- var _durationStorage = make(map[string][]float64)
- // StartPerformanceMonitor will keep track of the start time of this event.
- func StartPerformanceMonitor(key string) {
- l.Lock()
- if len(_durationStorage[key]) > 20 {
- _durationStorage[key] = removeHighValue(_durationStorage[key])
- }
- _pointsInTime[key] = time.Now()
- l.Unlock()
- }
- // GetAveragePerformance will return the average durations for the event.
- func GetAveragePerformance(key string) float64 {
- timestamp := _pointsInTime[key]
- if timestamp.IsZero() {
- return 0
- }
- l.Lock()
- defer l.Unlock()
- delta := time.Since(timestamp).Seconds()
- _durationStorage[key] = append(_durationStorage[key], delta)
- if len(_durationStorage[key]) < 8 {
- return 0
- }
- _durationStorage[key] = removeHighValue(_durationStorage[key])
- return Avg(_durationStorage[key])
- }
- func removeHighValue(values []float64) []float64 {
- sort.Float64s(values)
- return values[:len(values)-1]
- }
- // Avg will return the average value from a slice of float64s.
- func Avg(values []float64) float64 {
- total := 0.0
- for _, number := range values {
- total += number
- }
- average := total / float64(len(values))
- return average
- }
- // Sum returns the sum of a slice of values.
- func Sum(values []float64) float64 {
- total := 0.0
- for _, number := range values {
- total += number
- }
- return total
- }
- // MinMax will return the min and max values from a slice of float64s.
- func MinMax(array []float64) (float64, float64) {
- max := array[0]
- min := array[0]
- for _, value := range array {
- if max < value {
- max = value
- }
- if min > value {
- min = value
- }
- }
- return min, max
- }
- func mean(input []float64) float64 {
- sum := Sum(input)
- return sum / float64(len(input))
- }
- // Median gets the median number in a slice of numbers.
- func Median(input []float64) float64 {
- if len(input) == 1 {
- return input[0]
- }
- c := make([]float64, len(input))
- copy(c, input)
- var median float64
- l := len(c)
- if l%2 == 0 {
- median = mean(c[l/2-1 : l/2+1])
- } else {
- median = c[l/2]
- }
- return median
- }
|