Skip to content

Instantly share code, notes, and snippets.

@karlmutch
Created March 25, 2020 18:23
Show Gist options
  • Save karlmutch/0b359b0770900a1433ec1aec16f3c5da to your computer and use it in GitHub Desktop.
Save karlmutch/0b359b0770900a1433ec1aec16f3c5da to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"math"
"time"
)
// fdtime is time period for a execution time sampling
// ftime shows how fast it reacts on changes.
//
func MovingExpAvg(value, oldValue, fdtime, ftime time.Duration) time.Duration {
alpha := 1.0 - math.Exp(-fdtime.Seconds()/ftime.Seconds())
r := alpha*value.Seconds() + (1.0-alpha)*oldValue.Seconds()
return time.Duration(time.Duration(r) * time.Second)
}
func main() {
type execution struct {
duration time.Duration
delta time.Duration
}
executionTimes := []execution{
execution{time.Duration(10 * time.Minute), time.Duration(time.Minute)},
execution{time.Duration(12 * time.Minute), time.Duration(5 *time.Minute)},
execution{time.Duration(11 * time.Minute), time.Duration(10*time.Minute)},
execution{time.Duration(15 * time.Minute), time.Duration(time.Minute)},
execution{time.Duration(10 * time.Minute), time.Duration(time.Minute)},
execution{time.Duration(10 * time.Minute), time.Duration(time.Minute)},
}
v1 := time.Duration(10 * time.Minute) // initial value
v2 := time.Duration(10 * time.Minute) // initial value
v3 := time.Duration(10 * time.Minute) // initial value
ftime1 := time.Duration(5 * time.Second)
ftime2 := time.Duration(50 * time.Second)
ftime3 := time.Duration(500 * time.Second)
for _, measurement := range executionTimes {
v1 = MovingExpAvg(measurement.duration, v1, measurement.delta, ftime1)
v2 = MovingExpAvg(measurement.duration, v2, measurement.delta, ftime2)
v3 = MovingExpAvg(measurement.duration, v3, measurement.delta, ftime3)
fmt.Printf("%v %v %.v %v\n", measurement.duration, v1, v2, v3)
}
// Now a very greedy task which we wish to penalize
executionTimes = []execution{
execution{time.Duration(20 * time.Minute), time.Duration(2 *time.Minute)},
execution{time.Duration(22 * time.Minute), time.Duration(10 *time.Minute)},
execution{time.Duration(21 * time.Minute), time.Duration(20*time.Minute)},
execution{time.Duration(25 * time.Minute), time.Duration(2*time.Minute)},
execution{time.Duration(20 * time.Minute), time.Duration(2*time.Minute)},
execution{time.Duration(20 * time.Minute), time.Duration(2*time.Minute)},
}
v1 = time.Duration(10 * time.Minute) // initial value
v2 = time.Duration(10 * time.Minute) // initial value
v3 = time.Duration(10 * time.Minute) // initial value
for _, measurement := range executionTimes {
v1 = MovingExpAvg(measurement.duration, v1, measurement.delta, ftime1)
v2 = MovingExpAvg(measurement.duration, v2, measurement.delta, ftime2)
v3 = MovingExpAvg(measurement.duration, v3, measurement.delta, ftime3)
fmt.Printf("%v %v %.v %v\n", measurement.duration, v1, v2, v3)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment