commit 0a701bae96dfbea8212f8a34490341535f67a9f0
parent 45290297179b465ddf1a2d1cd098f3946ecb56af
Author: Jan de Mooij <jdemooij@mozilla.com>
Date: Mon, 5 Jan 2026 16:12:23 +0000
Bug 2002938 - Start source compression tasks less eagerly on non-shrinking GCs. r=jonco
This patch changes the heuristics so that pending compression tasks are immediately
started on shrinking GCs. For non-shrinking GCs it increases the delay from `gcNumber + 1`
to `gcNumber + 3`.
This reduces the number of compression tasks and compressed script sources on a full
Speedometer 3 run, and moves more of the compression tasks to shrinking GCs.
Differential Revision: https://phabricator.services.mozilla.com/D274387
Diffstat:
4 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/js/src/gc/GC.cpp b/js/src/gc/GC.cpp
@@ -2895,7 +2895,7 @@ bool GCRuntime::beginPreparePhase(JS::GCReason reason, AutoGCSession& session) {
* GCReason::XPCONNECT_SHUTDOWN GCs we can remove the extra check.
*/
if (!isShutdownGC() && reason != JS::GCReason::XPCONNECT_SHUTDOWN) {
- StartOffThreadCompressionsOnGC(rt);
+ StartOffThreadCompressionsOnGC(rt, isShrinkingGC());
}
return true;
diff --git a/js/src/vm/HelperThreadState.h b/js/src/vm/HelperThreadState.h
@@ -430,7 +430,7 @@ class GlobalHelperThreadState {
public:
// Used by a major GC to create and enqueue compression tasks.
- enum class ScheduleCompressionTask { GC, API };
+ enum class ScheduleCompressionTask { NonShrinkingGC, ShrinkingGC, API };
void createAndSubmitCompressionTasks(ScheduleCompressionTask schedule,
JSRuntime* rt);
diff --git a/js/src/vm/HelperThreads.cpp b/js/src/vm/HelperThreads.cpp
@@ -1637,10 +1637,10 @@ void GlobalHelperThreadState::createAndSubmitCompressionTasks(
return true;
}
- // If we're starting tasks on GC, we wait 2 major GCs to start compressing
- // in order to avoid immediate compression.
- if (schedule == ScheduleCompressionTask::GC &&
- rt->gc.majorGCCount() <= entry.majorGCNumber() + 1) {
+ // If we're starting tasks on a non-shrinking GC, we wait a few major GCs to
+ // start compressing in order to avoid immediate compression.
+ if (schedule == ScheduleCompressionTask::NonShrinkingGC &&
+ rt->gc.majorGCCount() <= entry.majorGCNumber() + 3) {
return false;
}
@@ -1722,9 +1722,13 @@ void GlobalHelperThreadState::runPendingSourceCompressions(JSRuntime* runtime) {
AttachFinishedCompressions(runtime, lock);
}
-void js::StartOffThreadCompressionsOnGC(JSRuntime* runtime) {
- HelperThreadState().createAndSubmitCompressionTasks(
- GlobalHelperThreadState::ScheduleCompressionTask::GC, runtime);
+void js::StartOffThreadCompressionsOnGC(JSRuntime* runtime,
+ bool isShrinkingGC) {
+ auto schedule =
+ isShrinkingGC
+ ? GlobalHelperThreadState::ScheduleCompressionTask::ShrinkingGC
+ : GlobalHelperThreadState::ScheduleCompressionTask::NonShrinkingGC;
+ HelperThreadState().createAndSubmitCompressionTasks(schedule, runtime);
}
template <typename T>
diff --git a/js/src/vm/HelperThreads.h b/js/src/vm/HelperThreads.h
@@ -307,7 +307,7 @@ void WaitForAllHelperThreads(AutoLockHelperThreadState& lock);
// Start handling any compression tasks for this runtime. Called at the start of
// major GC.
-void StartOffThreadCompressionsOnGC(JSRuntime* rt);
+void StartOffThreadCompressionsOnGC(JSRuntime* rt, bool isShrinkingGC);
// Cancel all scheduled, in progress, or finished compression tasks for
// runtime.