diff options
author | kwesolowski <krzysztof.wesolowski@rainlabs.pl> | 2014-07-25 09:24:45 (GMT) |
---|---|---|
committer | kwesolowski <krzysztof.wesolowski@rainlabs.pl> | 2014-07-25 09:24:45 (GMT) |
commit | 015d5edcbcaa41057383952d17f2b03a8bdf1c03 (patch) | |
tree | cf9fb995a99737d2133f7cb7f246fa387e0e969a /src/util.cc | |
parent | 23f81e0f23c769dfcf78af48aad0a85b35e36983 (diff) | |
download | Ninja-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.cc | 29 |
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 |