Created
March 25, 2020 18:23
-
-
Save karlmutch/0b359b0770900a1433ec1aec16f3c5da to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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