summaryrefslogtreecommitdiffstats
path: root/src/util.cc
diff options
context:
space:
mode:
authorkwesolowski <krzysztof.wesolowski@rainlabs.pl>2014-07-25 09:24:45 (GMT)
committerkwesolowski <krzysztof.wesolowski@rainlabs.pl>2014-07-25 09:24:45 (GMT)
commit015d5edcbcaa41057383952d17f2b03a8bdf1c03 (patch)
treecf9fb995a99737d2133f7cb7f246fa387e0e969a /src/util.cc
parent23f81e0f23c769dfcf78af48aad0a85b35e36983 (diff)
downloadNinja-015d5edcbcaa41057383952d17f2b03a8bdf1c03.zip
Ninja-015d5edcbcaa41057383952d17f2b03a8bdf1c03.tar.gz
Ninja-015d5edcbcaa41057383952d17f2b03a8bdf1c03.tar.bz2
Improved load calculation
Added code to gracefully handle: 1. Call to CalculateProcessorLoad with not incremented ticks (fast calls to GetSystemTimes can result same results), 2. Smooth/filter load estimation for consecutive calls.
Diffstat (limited to 'src/util.cc')
-rw-r--r--src/util.cc29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/util.cc b/src/util.cc
index 33cf204..89ed198 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -419,24 +419,34 @@ static double CalculateProcessorLoad(uint64_t idleTicks, uint64_t totalTicks)
{
static uint64_t previousIdleTicks = 0;
static uint64_t previousTotalTicks = 0;
-
+ static double previousLoad = -0.0f;
+
uint64_t idleTicksSinceLastTime = idleTicks - previousIdleTicks;
uint64_t totalTicksSinceLastTime = totalTicks - previousTotalTicks;
+ bool firstCall = (previousTotalTicks == 0);
+ bool ticksNotUpdatedSinceLastCall = (totalTicksSinceLastTime == 0);
+
double load;
- if (previousTotalTicks == 0) {
- //return error for first call
- load = -0.0;
- } else if(totalTicksSinceLastTime == 0) {
- //return error when load cannot be calculated
- load = -0.0;
+ if (firstCall || ticksNotUpdatedSinceLastCall) {
+ load = previousLoad;
} else {
+ //calculate load
double idleToTotalRatio = ((double)idleTicksSinceLastTime) / totalTicksSinceLastTime;
- load = 1.0 - idleToTotalRatio;
+ double loadSinceLastCall = 1.0 - idleToTotalRatio;
+
+ //filter/smooth result when possible
+ if(previousLoad > 0) {
+ load = 0.9 * previousLoad + 0.1 * loadSinceLastCall;
+ } else {
+ load = loadSinceLastCall;
+ }
}
-
+
+ previousLoad = load;
previousTotalTicks = totalTicks;
previousIdleTicks = idleTicks;
+
return load;
}
@@ -462,6 +472,7 @@ double GetLoadAverage() {
} else {
result = -0.0;
}
+
return result;
}
#else