diff options
author | Andrew McCreight <continuation@gmail.com> | 2019-01-29 13:36:19 +0100 |
---|---|---|
committer | wolfbeast <mcwerewolf@wolfbeast.com> | 2019-01-29 13:36:19 +0100 |
commit | 888fbacfe0b1c71e2d7cbd1552aca6f424dc0d93 (patch) | |
tree | 777c35c81122f36cc1c025f0f5d336680b4c8657 | |
parent | babedf6c696f88734e59b63d0c6614962cc57519 (diff) | |
download | UXP-888fbacfe0b1c71e2d7cbd1552aca6f424dc0d93.tar UXP-888fbacfe0b1c71e2d7cbd1552aca6f424dc0d93.tar.gz UXP-888fbacfe0b1c71e2d7cbd1552aca6f424dc0d93.tar.lz UXP-888fbacfe0b1c71e2d7cbd1552aca6f424dc0d93.tar.xz UXP-888fbacfe0b1c71e2d7cbd1552aca6f424dc0d93.zip |
Increase slice time for longer running CCs.
If a CC takes too long (around 50 slices) or gets interrupted by a GC,
we have to finish it synchronously, which can cause a big pause.
This patch tries to avoid that by eagerly increasing the slice budget
the longer a CC goes on. It linearly increases the slice time from 5ms
to 40ms as we approach the halfway point of a CC (1 second), matching
GC pauses, and then leaves it at 40ms.
-rw-r--r-- | dom/base/nsJSEnvironment.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index ebce7ea3f..3f28533d3 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1355,9 +1355,20 @@ nsJSContext::RunCycleCollectorSlice() TimeStamp now = TimeStamp::Now(); // Only run a limited slice if we're within the max running time. - if (TimeBetween(gCCStats.mBeginTime, now) < kMaxICCDuration) { - float sliceMultiplier = std::max(TimeBetween(gCCStats.mEndSliceTime, now) / (float)kICCIntersliceDelay, 1.0f); - budget = js::SliceBudget(js::TimeBudget(kICCSliceBudget * sliceMultiplier)); + uint32_t runningTime = TimeBetween(gCCStats.mBeginTime, now); + if (runningTime < kMaxICCDuration) { + // Try to make up for a delay in running this slice. + float sliceDelayMultiplier = TimeBetween(gCCStats.mEndSliceTime, now) / (float)kICCIntersliceDelay; + float delaySliceBudget = kICCSliceBudget * sliceDelayMultiplier; + + // Increase slice budgets up to |maxLaterSlice| as we approach + // half way through the ICC, to avoid large sync CCs. + float percentToHalfDone = std::min(2.0f * runningTime / kMaxICCDuration, 1.0f); + const float maxLaterSlice = 40.0f; + float laterSliceBudget = maxLaterSlice * percentToHalfDone; + + budget = js::SliceBudget(js::TimeBudget(std::max({delaySliceBudget, + laterSliceBudget, (float)kICCSliceBudget}))); } } } |