summaryrefslogtreecommitdiffstats
path: root/dom/base
diff options
context:
space:
mode:
authorAndrew McCreight <continuation@gmail.com>2019-01-29 13:36:19 +0100
committerwolfbeast <mcwerewolf@wolfbeast.com>2019-01-29 13:36:19 +0100
commit888fbacfe0b1c71e2d7cbd1552aca6f424dc0d93 (patch)
tree777c35c81122f36cc1c025f0f5d336680b4c8657 /dom/base
parentbabedf6c696f88734e59b63d0c6614962cc57519 (diff)
downloadUXP-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.
Diffstat (limited to 'dom/base')
-rw-r--r--dom/base/nsJSEnvironment.cpp17
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})));
}
}
}